본문 바로가기
BackEnd/Project

[RealPJ] Ch02. Log를 관리하기 위한 Logback 설정(4)

by 개발 Blog 2024. 8. 31.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

이번 시간에는 에러 로그경고 로그를 별도로 필터링하여 저장하는 방식으로 Logback 어펜더를 생성하는 방법을 알아본다.

 

1. Logback 설정에 에러 및 경고 로그 어펜더 추가

먼저, logback-spring-prod.xml 파일에 에러 로그와 경고 로그를 처리할 로직을 추가한다. 이를 통해 로그 레벨에 따라 로그 파일을 별도로 관리할 수 있다.

<included>
    <property resource="logback-variables.properties"/> <!-- logback-variables.properties 사용-->

    <appender name="REQUEST1" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/request1.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/request1.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>1KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [REQUEST1] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="REQUEST2" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/request2.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/request2.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [REQUEST2] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="MDC" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/mdc.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/mdc.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [MDC] %X{job}%n
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [ERROR] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/warn.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/warn.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [WARN] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <root level="INFO">
<!--        <appender-ref ref="REQUEST1"/>-->
<!--        <appender-ref ref="REQUEST2"/>-->
<!--        <appender-ref ref="MDC"/>-->
        <appender-ref ref="ERROR"/>
        <appender-ref ref="WARN"/>

    </root>

</included>
  • 이 설정을 통해, 에러 로그는 error.log 파일에, 경고 로그는 warn.log 파일에 각각 저장된다. 로그 레벨에 따라 파일을 별도로 관리할 수 있게 된다.

2. 서버 실행 및 로그 확인

이제 서버를 실행하고, /demo 엔드포인트에 요청을 보내보자. 요청을 보내면 logs 디렉토리에 error.log와 warn.log 파일이 생성된다. 이 파일들은 각각 에러와 경고 로그만을 담고 있다.

 

실행 결과

error.log

#logback.classic pattern: [ERROR] [%-5level] %d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{0}:%line] - %msg%n
[ERROR] [ERROR] 2024-08-31 04:22:24 [http-nio-8080-exec-1] [DemoController:16] - log -> ERROR

 

warn.log

#logback.classic pattern: [ERROR] [%-5level] %d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{0}:%line] - %msg%n
[ERROR] [ERROR] 2024-08-31 04:22:24 [http-nio-8080-exec-1] [DemoController:16] - log -> ERROR

 

3. 결론

이렇게 로그 레벨에 따라 로그 파일을 분리하여 관리하면, 로그의 가독성이 높아지고 특정 레벨의 로그만을 별도로 확인하기가 수월해진다. 이번 실습에서는 에러 로그와 경고 로그를 각각 별도의 파일로 관리하는 방법을 알아보았다.