본문 바로가기
Programming/JAVA

logback 사용 시 log level별 appender 설정

by ★용호★ 2017. 4. 25.

로그 레벨에 따라 로그를 출력하는 방식을 다르게 하고 싶은 경우 filter를 사용하여 이를 구현 할 수 있다. 로그 레벨에 따라 filter를 지정하므로 ch.qos.logback.classic.filter.LevelFilter를 사용한다.

<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>error</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <file>Log/error.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>Log/error-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
        <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
        <maxFileSize>100MB</maxFileSize>
        <maxHistory>60</maxHistory>
        <totalSizeCap>10GB</totalSizeCap>
    </rollingPolicy>

    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level] : %msg%n</pattern>
    </encoder>
</appender>

위의 예제의 경우 loglevel이 error인 경우 파일에 로그를 남긴다. 또 다른 appender를 추가하여 레벨에 따라 콘솔에만 로그를 남기게 할 수도 있고 logstash로 전달하게도 할 수 있다. 아래는 각 레벨별 로그 설정에 대한 전문이다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level] : %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <file>Log/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>Log/error-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>60</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>

        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level] : %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="LogstashAppender" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <destination>192.168.10.73:5001</destination>

        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>
    <root level="debug">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ERROR"/>
        <appender-ref ref="LogstashAppender"/>
    </root>
</configuration>

STDOUT appender를 통해 레벨에 상관없이 모든 로그를 콘솔 출력하고, ERROR 레벨의 로그는 error.log 파일에 남긴다. 그 외 DEBUG 레벨의 로그들은 logstash로 전달하여 elk를 사용해서 로그를 관리한다.

'Programming > JAVA' 카테고리의 다른 글

logback 사용 시 jdbc 로그 찍는 방법  (0) 2017.04.25
tomcat 모니터링  (0) 2017.04.10
getClass에 대해서  (0) 2016.03.31
Map의 keySet()을 활용해보았다.  (0) 2016.03.31

댓글