<!--

    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{ISO8601_OFFSET_DATE_TIME_HHMM} [%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{ISO8601_OFFSET_DATE_TIME_HHMM} [%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{ISO8601_OFFSET_DATE_TIME_HHMM} [%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>