<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->
<Configuration>
    <name>pulsar-functions-instance</name>
    <monitorInterval>30</monitorInterval>
    <Properties>
        <Property>
            <name>pulsar.log.appender</name>
            <value>RollingFile</value>
        </Property>
        <Property>
            <name>pulsar.log.level</name>
            <value>info</value>
        </Property>
        <Property>
            <name>bk.log.level</name>
            <value>info</value>
        </Property>
    </Properties>
    <Appenders>
        <Console>
            <name>Console</name>
            <target>SYSTEM_OUT</target>
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
        </Console>
        <RollingFile>
            <name>RollingFile</name>
            <fileName>${sys:pulsar.function.log.dir}/${sys:pulsar.function.log.file}.log</fileName>
            <filePattern>${sys:pulsar.function.log.dir}/${sys:pulsar.function.log.file}-%d{MM-dd-yyyy}-%i.log.gz</filePattern>
            <immediateFlush>true</immediateFlush>
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy>
                    <interval>1</interval>
                    <modulate>true</modulate>
                </TimeBasedTriggeringPolicy>
                <SizeBasedTriggeringPolicy>
                    <size>1 GB</size>
                </SizeBasedTriggeringPolicy>
                <CronTriggeringPolicy>
                    <schedule>0 0 0 * * ?</schedule>
                </CronTriggeringPolicy>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete>
                    <basePath>${sys:pulsar.function.log.dir}</basePath>
                    <maxDepth>2</maxDepth>
                    <IfFileName>
                        <glob>*/${sys:pulsar.function.log.file}*log.gz</glob>
                    </IfFileName>
                    <IfLastModified>
                        <age>30d</age>
                    </IfLastModified>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
        <RollingRandomAccessFile>
            <name>BkRollingFile</name>
            <fileName>${sys:pulsar.function.log.dir}/${sys:pulsar.function.log.file}.bk</fileName>
            <filePattern>${sys:pulsar.function.log.dir}/${sys:pulsar.function.log.file}.bk-%d{MM-dd-yyyy}-%i.log.gz</filePattern>
            <immediateFlush>true</immediateFlush>
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy>
                    <interval>1</interval>
                    <modulate>true</modulate>
                </TimeBasedTriggeringPolicy>
                <SizeBasedTriggeringPolicy>
                    <size>1 GB</size>
                </SizeBasedTriggeringPolicy>
                <CronTriggeringPolicy>
                    <schedule>0 0 0 * * ?</schedule>
                </CronTriggeringPolicy>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete>
                    <basePath>${sys:pulsar.function.log.dir}</basePath>
                    <maxDepth>2</maxDepth>
                    <IfFileName>
                        <glob>*/${sys:pulsar.function.log.file}.bk*log.gz</glob>
                    </IfFileName>
                    <IfLastModified>
                        <age>30d</age>
                    </IfLastModified>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Logger>
            <name>org.apache.pulsar.functions.runtime.shaded.org.apache.bookkeeper</name>
            <level>${sys:bk.log.level}</level>
            <additivity>false</additivity>
            <AppenderRef>
                <ref>BkRollingFile</ref>
            </AppenderRef>
        </Logger>
        <Root>
            <level>info</level>
            <AppenderRef>
                <ref>${sys:pulsar.log.appender}</ref>
                <level>${sys:pulsar.log.level}</level>
            </AppenderRef>
        </Root>
    </Loggers>
</Configuration>