<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- properties -->
    <property name="SERVICE_NAME" value="BUS"/>
    <property name="CHAR_SET" value="UTF-8"/>

    <!-- Log info properties -->
    <property name="LOG_DIR_NAME" value="${SERVICE_NAME}_LOG"/>
    <property name="LOG_PATH" value="C:/PACSDATA/LOG/${LOG_DIR_NAME}"/>
    <property name="LOG_LEVEL" value="TRACE"/>
    <property name="LOG_PATTERN" value="%.-1level %d{HH:mm:ss.SSS} [%.-10t] %c{1}.%method\\(%line\\) %.-500msg%n"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="%.-1level %d{HH:mm:ss.SSS} [%.-10t] %c{1}.%method\\(%line\\) %.-500msg%n"/>

    <!-- File name properties -->
    <property name="FILE_NAME" value="${LOG_PATH}/${SERVICE_NAME}"/>
    <property name="LOG_FILE_NAME" value="${FILE_NAME}.log"/>
    <property name="DEBUG_FILE_NAME" value="${FILE_NAME}_debug.log"/>
    <property name="INFO_FILE_NAME" value="${FILE_NAME}_info.log"/>
    <property name="ERROR_FILE_NAME" value="${FILE_NAME}_error.log"/>

    <!-- File pattern properties -->
    <property name="FILE_PATTERN" value="${FILE_NAME}_%d{yyyy-MM-dd}"/>
    <property name="LOG_FILE_PATTERN" value="${FILE_PATTERN}(%i).log"/>
    <property name="DEBUG_FILE_PATTERN" value="${FILE_PATTERN}_debug(%i).log"/>
    <property name="INFO_FILE_PATTERN" value="${FILE_PATTERN}_info(%i).log"/>
    <property name="ERROR_FILE_PATTERN" value="${FILE_PATTERN}_error(%i).log"/>

    <!-- Rolling properties -->
    <property name="MAX_HISTORY" value="30"/>
    <property name="MAX_FILE_SIZE" value="300MB"/>
    <property name="TOTAL_SIZE_CAP" value="1GB"/>

    <!-- Console appender -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>${CHAR_SET}</charset>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>${LOG_LEVEL}</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <!-- Custom Console appender -->
    <appender name="logoutput" class="mdcpk.log.MyOutputStreamAppender">
        <encoder>
            <charset>${CHAR_SET}</charset>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>${LOG_LEVEL}</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <!-- File log appender -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE_NAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_PATTERN}</fileNamePattern>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>${CHAR_SET}</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>${LOG_LEVEL}</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT
            </onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
        </filter>
    </appender>

    <?ignore
    <!-- Debug log appender -->
    <appender name="debugLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEBUG_FILE_NAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${DEBUG_FILE_PATTERN}</fileNamePattern>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>${CHAR_SET}</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY
            </onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
        </filter>
    </appender>

    <!-- Info log appender -->
    <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${INFO_FILE_NAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${INFO_FILE_PATTERN}</fileNamePattern>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>${CHAR_SET}</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- Error log appender -->
    <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${ERROR_FILE_NAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${ERROR_FILE_PATTERN}</fileNamePattern>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>${CHAR_SET}</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    ?>

    <root level="TRACE">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
        <appender-ref ref="logoutput"/>
        <!-- <appender-ref ref="errorLog" /> -->
        <!-- <appender-ref ref="infoLog" /> -->
        <!-- <appender-ref ref="debugLog" /> -->
    </root>
</configuration>