<?xml version="1.0" encoding="utf-8"?>
<!--
# Copyright © 2018 Amdocs, Bell Canada, AT&T, ZTE
# Licensed 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 scan="true" scanPeriod="3 seconds">
    <property name="logDir" value="/var/log/onap"/>
    <property name="componentName" scope="system" value="sdc"/>
    <property name="subComponentName" scope="system" value="sdc-be"/>
    <property name="logDirectory" value="${logDir}/${componentName}/${subComponentName}"/>
    <property file="${config.home}/catalog-be/configuration.yaml"/>
    <property name="enable-all-log" scope="context" value="false"/>
    <!--  log file names -->
    <property name="errorLogName" value="error"/>
    <property name="metricsLogName" value="metrics"/>
    <property name="auditLogName" value="audit"/>
    <property name="debugLogName" value="debug"/>
    <property name="transactionLogName" value="transaction"/>
    <property name="allLogName" value="all"/>
    <property name="queueSize" value="256"/>
    <property name="maxFileSize" value="50MB"/>
    <property name="maxHistory" value="30"/>
    <property name="totalSizeCap" value="10GB"/>
    <property name="pattern"
        value="%d{&quot;yyyy-MM-dd'T'HH:mm:ss.SSSXXX&quot;, UTC}\t[%thread]\t%-5level\t%logger{36}\t%replace(%replace(%replace(%mdc){'\t','\\\\t'}){', ','\t'}){'\n', '\\\\n'}\t%replace(%replace(%msg){'\n', '\\\\n'}){'\t','\\\\t'}%n"/>

    <!-- STDOUT -->
    <appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- STDERR -->
    <appender class="ch.qos.logback.core.ConsoleAppender" name="STDERR">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
        </encoder>
    </appender>

    <!-- All log -->
    <if condition='property("enable-all-log").equalsIgnoreCase("true")'>
        <then>
            <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="ALL_ROLLING">
                <file>${logDirectory}/${allLogName}.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>${logDirectory}/${allLogName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <maxFileSize>${maxFileSize}</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                    <maxHistory>${maxHistory}</maxHistory>
                    <totalSizeCap>${totalSizeCap}</totalSizeCap>
                </rollingPolicy>
                <encoder>
                    <pattern>${pattern}</pattern>
                </encoder>
            </appender>
            <appender class="ch.qos.logback.classic.AsyncAppender" name="ASYNC_ALL">
                <appender-ref ref="ALL_ROLLING"/>
            </appender>
        </then>
    </if>
    <!-- Error log -->
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="ERROR_ROLLING">
        <file>${logDirectory}/${errorLogName}.log</file>
        <!-- Audit messages filter - deny audit messages -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>AUDIT_MARKER</marker>
            </evaluator>
            <onMismatch>NEUTRAL</onMismatch>
            <onMatch>DENY</onMatch>
        </filter>
        <!-- Transaction messages filter - deny Transaction messages -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>TRANSACTION_MARKER</marker>
            </evaluator>
            <onMismatch>NEUTRAL</onMismatch>
            <onMatch>DENY</onMatch>
        </filter>
        <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!-- Debug log -->
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="DEBUG_ROLLING">
        <file>${logDirectory}/${debugLogName}.log</file>
        <!-- No need to deny audit messages - they are INFO only, will be denied anyway -->
        <!-- Transaction messages filter - deny Transaction messages, there are some DEBUG level messages among them -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>TRANSACTION_MARKER</marker>
            </evaluator>
            <onMismatch>NEUTRAL</onMismatch>
            <onMatch>DENY</onMatch>
        </filter>
        <!-- accept DEBUG and TRACE level -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                <expression>e.level.toInt() &lt;= DEBUG.toInt()</expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>NEUTRAL</OnMatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!-- Audit log -->
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="AUDIT_ROLLING">
        <file>${logDirectory}/${auditLogName}.log</file>
        <!-- Audit messages filter - accept audit messages -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>AUDIT_MARKER</marker>
            </evaluator>
            <onMismatch>DENY</onMismatch>
            <onMatch>ACCEPT</onMatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!-- SdncTransaction log -->
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="TRANSACTION_ROLLING">
        <file>${logDirectory}/${transactionLogName}.log</file>
        <!-- Transaction messages filter - accept audit messages -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
                <marker>TRANSACTION_MARKER</marker>
            </evaluator>
            <onMismatch>DENY</onMismatch>
            <onMatch>ACCEPT</onMatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logDirectory}/${transactionLogName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!-- Asynchronicity Configurations -->
    <appender class="ch.qos.logback.classic.AsyncAppender" name="ASYNC_DEBUG">
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="DEBUG_ROLLING"/>
    </appender>
    <appender class="ch.qos.logback.classic.AsyncAppender" name="ASYNC_TRANSACTION">
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="TRANSACTION_ROLLING"/>
    </appender>
    <appender class="ch.qos.logback.classic.AsyncAppender" name="ASYNC_ERROR">
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="ERROR_ROLLING"/>
    </appender>
    <appender class="ch.qos.logback.classic.AsyncAppender" name="ASYNC_AUDIT">
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="AUDIT_ROLLING"/>
    </appender>
    <root level="INFO">
        <appender-ref ref="ASYNC_ERROR"/>
        <appender-ref ref="ASYNC_DEBUG"/>
        <appender-ref ref="ASYNC_AUDIT"/>
        <appender-ref ref="ASYNC_TRANSACTION"/>
        <if condition='property("enable-all-log").equalsIgnoreCase("true")'>
            <then>
                <appender-ref ref="ALL_ROLLING"/>
            </then>
        </if>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STDERR"/>
    </root>
    <logger level="INFO" name="org.openecomp.sdc"/>
</configuration>