본문 바로가기
Spring

logback-spring.xml 로그 파일 level별 설정 문제

by Mecodata 2023. 9. 13.

문제

- 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도 필수적으로 입력할 것!

'Spring' 카테고리의 다른 글

Multipart  (0) 2023.12.20
log4jdbc  (1) 2023.09.14
Logback  (0) 2023.09.12
의존성 주입 방식  (0) 2023.05.25
JWT  (0) 2023.05.25

댓글