<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds">

	<property scope="system" name="ECOMP-component-name" value="SDC" />
	<property scope="system" name="ECOMP-subcomponent-name" value="SDC-BE" />
	<property file="${config.home}/catalog-be/configuration.yaml" />
	<property scope="context" name="enable-all-log" value="false" />

	<!-- value used by pattern field list (| - is inter-field separator, || - unavailable or not applicable field value) (m - mandatory, o- optional)-->
	<!--timestamp(m)| requestID(m)| serviceInstanceID(o)| threadID(m)| physicalServerName(o)| serviceName(m)| userID(m)| logLevel(m)| severity(o)| serverIpAddress(m)| serverName(m)| clientIpAddress(o)| className(m)| timer(o)| detailedMessage(o)-->
	<property name="default-log-pattern"
			  value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{BeginTimestamp}|%X{EndTimestamp}|%X{uuid}|%X{serviceInstanceID}|%thread|%X{ServerName}|%X{ServiceName}|${ECOMP-subcomponent-name}|%X{userId}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%level|%X{alarmSeverity}|%X{localAddr}|%X{ElapsedTime}|${beFqdn}|%X{remoteAddr}|%logger{35}|%X{timer}|ActivityType=&lt;%M&gt;, Desc=&lt;%msg&gt;%n" />

	<property name="error-log-pattern"
			  value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%msg|%n" />

	<property name="audit-log-pattern" value="%X{AuditBeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|ActivityType=&lt;%M&gt;, Desc=&lt;%msg&gt;%n" />

	<property name="metric-log-pattern" value="%X{MetricBeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|ActivityType=&lt;%M&gt;, Desc=&lt;%msg&gt;%n" />

	<property name="debug-log-pattern" value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%msg|^\n%n"/>

	<!-- All log -->
	<if condition='property("enable-all-log").equalsIgnoreCase("true")'>
		<then>
			<appender name="ALL_ROLLING"
				class="ch.qos.logback.core.rolling.RollingFileAppender">
				<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/all.log
				</file>

				<rollingPolicy
					class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
					<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/all.log.%i
					</fileNamePattern>
					<minIndex>1</minIndex>
					<maxIndex>10</maxIndex>
				</rollingPolicy>

				<triggeringPolicy
					class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
					<maxFileSize>20MB</maxFileSize>
				</triggeringPolicy>
				<encoder>
					<pattern>${default-log-pattern}</pattern>
				</encoder>
			</appender>

			<appender name="ASYNC_ALL" class="ch.qos.logback.classic.AsyncAppender">
				<appender-ref ref="ALL_ROLLING" />
			</appender>
		</then>
	</if>

	<!-- Error log -->
	<appender name="ERROR_ROLLING"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/error.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.FixedWindowRollingPolicy">
			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/error.log.%i
			</fileNamePattern>
			<minIndex>1</minIndex>
			<maxIndex>10</maxIndex>
		</rollingPolicy>

		<triggeringPolicy
			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<maxFileSize>20MB</maxFileSize>
		</triggeringPolicy>
		<encoder>
			<pattern>${error-log-pattern}</pattern>
		</encoder>
	</appender>

	<!-- Debug log -->
	<appender name="DEBUG_ROLLING"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/debug.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>-->
			<OnMatch>ACCEPT</OnMatch>
		</filter>

		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/debug.log.%i
			</fileNamePattern>
			<minIndex>1</minIndex>
			<maxIndex>10</maxIndex>
		</rollingPolicy>

		<triggeringPolicy
			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<maxFileSize>20MB</maxFileSize>
		</triggeringPolicy>
		<encoder>
			<pattern>${debug-log-pattern}</pattern>
		</encoder>
	</appender>


	<!-- ASDC debug by package-->
	<appender name="PACKAGE_DEBUG_ROLLING"
			  class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/debug_by_package.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.FixedWindowRollingPolicy">
			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/debug_by_package.log.%i
			</fileNamePattern>
			<minIndex>1</minIndex>
			<maxIndex>10</maxIndex>
		</rollingPolicy>

		<triggeringPolicy
				class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<maxFileSize>20MB</maxFileSize>
		</triggeringPolicy>
		<encoder>
			<pattern>${debug-log-pattern}</pattern>
		</encoder>
	</appender>

	<!-- Audit log -->
	<appender name="AUDIT_ROLLING"
		class="ch.qos.logback.core.rolling.RollingFileAppender">

		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/audit.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>
				<marker>AUDIT</marker>
			</evaluator>
			<onMismatch>DENY</onMismatch>
			<onMatch>ACCEPT</onMatch>
		</filter>

		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/audit.log.%i
			</fileNamePattern>
			<minIndex>1</minIndex>
			<maxIndex>10</maxIndex>
		</rollingPolicy>

		<triggeringPolicy
			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<maxFileSize>20MB</maxFileSize>
		</triggeringPolicy>
		<encoder>
			<pattern>${audit-log-pattern}</pattern>
		</encoder>
	</appender>
	
	<!-- Metrics log -->
	<appender name="METRICS_ROLLING"
		class="ch.qos.logback.core.rolling.RollingFileAppender">

		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/metrics.log
		</file>

		<!-- Metric messages filter - accept metric messages -->
		<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
			<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
				<marker>METRICS</marker>
			</evaluator>
			<onMismatch>DENY</onMismatch>
			<onMatch>ACCEPT</onMatch>
		</filter>

		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/metrics.log.%i
			</fileNamePattern>
			<minIndex>1</minIndex>
			<maxIndex>10</maxIndex>
		</rollingPolicy>

		<triggeringPolicy
			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<maxFileSize>20MB</maxFileSize>
		</triggeringPolicy>
		<encoder>
			<pattern>${metric-log-pattern}</pattern>
		</encoder>
	</appender>

	<!-- SdncTransaction log -->
	<appender name="TRANSACTION_ROLLING"
		class="ch.qos.logback.core.rolling.RollingFileAppender">

		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/transaction.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.FixedWindowRollingPolicy">
			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/transaction.log.%i
			</fileNamePattern>
			<minIndex>1</minIndex>
			<maxIndex>10</maxIndex>
		</rollingPolicy>

		<triggeringPolicy
			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<maxFileSize>20MB</maxFileSize>
		</triggeringPolicy>
		<encoder>
			<pattern>${default-log-pattern}</pattern>
		</encoder>
	</appender>
	
	<!-- Asynchronicity Configurations -->
	<appender name="ASYNC_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
	      <appender-ref ref="DEBUG_ROLLING" />
	</appender>

	<appender name="ASYNC_TRANSACTION" class="ch.qos.logback.classic.AsyncAppender">
	      <appender-ref ref="TRANSACTION_ROLLING" />
	</appender>
	
	<appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
	      <appender-ref ref="ERROR_ROLLING" />
	</appender>

	<root level="INFO">
		<appender-ref ref="ASYNC_ERROR" />
		<appender-ref ref="ASYNC_DEBUG" />
		<appender-ref ref="AUDIT_ROLLING" />
		<appender-ref ref="ASYNC_TRANSACTION" />
		<appender-ref ref="METRICS_ROLLING" />
		<if condition='property("enable-all-log").equalsIgnoreCase("true")'>
			<then>
				<appender-ref ref="ALL_ROLLING" />
			</then>
		</if>
	</root>

	<logger name="org.openecomp.sdc" level="INFO" />
</configuration>