Log4j2를 이용한 로깅(logging) 방법 - IV
이번 시간에는 로그를 파일에 기록할 때 심각도(debug, info, wran, error 등)에 따라서 별도 파일로 구분해서 기록하는 방법에 대해서 살펴보겠습니다.
1. 기존 어펜더 확인
log4j2 설정 파일(log4j2-dev-file.xml)에 <Appenders>를 보겠습니다.
<Appenders>
<!-- 콘솔 출력 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- 로그 파일 기록 :: Root -->
<File name="FileByInfo" fileName="${LOG_PATH}/spring-info.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</File>
<!-- 로그 파일 기록 :: Application -->
<File name="FileForAppByInfo" fileName="${LOG_PATH}/spring-app-info.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</File>
</Appenders>
로그를 파일에 기록하는 어펜더가 2개(FileByInfo, FileForAppByInfo) 보입니다. 그리고 각각 <Filters>가 있는데요, 로그 심각도(level)가 'INFO' 되어있습니다. 이렇게 설정하면 파일에 기록되는 로그는 INFO 이상의 로그만 기록됩니다.
※ 참고. 로그 심각도는 TRACE > DEBUG > INFO > WARN > ERROR > FATAL 순입니다.
2. 어펜더 추가
로그 심각도에 따라서 파일을 분리해 보죠. log4j2-dev-file.xml을 다음과 같이 수정합니다.
<Appenders>
<!-- 콘솔 출력 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- 로그 파일 기록 :: Root -->
<File name="FileByInfo" fileName="${LOG_PATH}/spring-info.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</File>
<!-- 로그 파일 기록 :: Application -->
<!--
<File name="FileForAppByInfo" fileName="${LOG_PATH}/spring-app-info.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</File>
-->
<!-- DEBUG -->
<File name="FileForAppByDebug" fileName="${LOG_PATH}/spring-app-debug.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</File>
<!-- INFO -->
<File name="FileForAppByInfo" fileName="${LOG_PATH}/spring-app-info.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</File>
<!-- WARN -->
<File name="FileForAppByWarn" fileName="${LOG_PATH}/spring-app-warn.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</File>
<!-- ERROR -->
<File name="FileForAppByError" fileName="${LOG_PATH}/spring-app-error.log">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</File>
</Appenders>
기존에 사용하던 'FileForAppByInfo'를 주석처리해서 사용하지 않고, 대신 'FileForAppByDebug', 'FileForAppByInfo', 'FileForAppByWarn', 'FileForAppByError' 어펜더를 추가 했습니다. 각각의 어펜더는 이름에서 알수 있듯이 DEBUG용, INFO용, WARN용, ERROR용 입니다. 그리고 기존에 사용했던 <ThresholdFilter> 대신 <LevelRangeFilter>를 사용합니다. <LevelRangeFilter>은 속성으로 'minLevel'과 'maxLevel'를 가지고 있는데요, 'minLevel'은 최소 심각도를 설정하고 'maxLevel'은 최대 심각도를 설정합니다. 즉 'FileForAppByDebug' 어펜더는 'minLevel'과 'maxLevel'이 'DEBUG'로 되어 있기 때문에 'DEBUG' 로그만 기록합니다.
※ 참고.
- onMatch 속성: 심각도가 일치하면 허용
- onMismatch 속성: 심각도가 일치하지 않으면 무시
<!-- DEBUG만 허용하고 그렇지 않으면 무시-->
<LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
이렇게 하면 심각도에 따른 어펜더를 분리했습니다.
그리고 'fileName' 속성에 저장되는 파일 이름을 지정했습니다.
<!-- DEBUG -->
<File name="FileForAppByDebug" fileName="${LOG_PATH}/spring-app-debug.log">
<!-- INFO -->
<File name="FileForAppByInfo" fileName="${LOG_PATH}/spring-app-info.log">
<!-- WARN -->
<File name="FileForAppByWarn" fileName="${LOG_PATH}/spring-app-warn.log">
<!-- ERROR -->
<File name="FileForAppByError" fileName="${LOG_PATH}/spring-app-error.log">
3. 어펜더를 <Logger>에 적용
심각도에 따른 어펜더를 만들었으니, 이제 어펜더를 <Logger>에 적용합니다.
<Loggers>
<!-- 기본 로거 설정 -->
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileByInfo"/>
</Root>
<!-- 애플리케이션 패키지 로깅 -->
<Logger name="com.office" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileForAppByDebug"/> <!-- DEBUG 어펜더 적용 -->
<AppenderRef ref="FileForAppByInfo"/> <!-- INFO 어펜더 적용 -->
<AppenderRef ref="FileForAppByWarn"/> <!-- WARN 어펜더 적용 -->
<AppenderRef ref="FileForAppByError"/> <!-- ERROR 어펜더 적용 -->
</Logger>
</Loggers>
4. 애플리케이션 실행 로그 파일 확인
설정이 완료됐습니다. 이제 애플리케이션을 실행하고 logs 디렉터리에 심각도에 따라 파일일 분리됐는지 확인합니다.
파일을 메모장에서 확인해 보면 심각도에 따라 해당 로그만 기록된것을 확인할 수 있습니다.
이번 시간에는 로그 심각도에 따라 파일을 분리하는 방법에 대해서 살펴봤습니다. 반듯이 심각도에 따라 파일을 분리해야 하는 것은 아닙니다. 프로젝트를 관리하는 내부 정책에 따라 유연하게 설정하면됩니다.
다음 시간에는 파일 용량이 커질 때 파일을 추가로 생성하는 방법에 대해서 살펴보겠습니다.