문제
- logback-spring.xml를 통해 레벨 INFO 이상의 모든 로그를 저장하는 total.2023-09-13_0.log와 레벨 ERROR에 대한 로그만을 저장하는 error.2023-09-13_0.log를 생성하도록 의도하였지만 error.2023-09-13_0.log도 total.2023-09-13_0.log와 같이 INFO 이상의 모든 로그를 저장
logback-spring.xml 코드
<configuration>
<property name="LOG_PATTERN" value="%p %d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{0}:%line] - %msg%n "/>
<!-- 에러의 경우 파일에 로그 처리 -->
<appender name="File-Error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- INFO 레벨의 로그를 저장할 앱렌더 추가 -->
<appender name="File-Info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/total.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- root 레벨 설정 -->
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE"/>
<!-- INFO 레벨 로그는 Info appender로 보냄 -->
<appender-ref ref="File-Info"/>
<!-- ERROR 레벨 로그는 Error appender로 보냄 -->
<appender-ref ref="File-Error"/>
</root>
</configuration>
원인
- File-Error Appender에서 filter 태그(LevelFilter)에서 level만 설정하고 onMatch와 onMismatch에 대한 설정을 입력하지 않아 필터링이 되지 않고 모든 로그가 저장
해결 방법
- File-Error Appender에서 filter 태그(LevelFilter)에서 onMatch에는 ACCEPT, onMismatch에는 DENY 설정을 적용
수정된 logback 코드
<configuration>
<property name="LOG_PATTERN" value="%p %d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{0}:%line] - %msg%n "/>
<!-- 에러의 경우 파일에 로그 처리 -->
<appender name="File-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>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- INFO 레벨의 로그를 저장할 앱렌더 추가 -->
<appender name="File-Info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<maxFileSize>10MB</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- root 레벨 설정 -->
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE"/>
<!-- INFO 레벨 로그는 Info appender로 보냄 -->
<appender-ref ref="File-Info"/>
<!-- ERROR 레벨 로그는 Error appender로 보냄 -->
<appender-ref ref="File-Error"/>
</root>
</configuration>
결론
- Appender에서 Filter로 LevelFilter를 사용할 경우에는 level만 설정해도 실행에 문제가 없지만 의도한 필터링 적용을 위해서 onMatch와 onMismatch도 필수적으로 입력할 것!
댓글