spring boot

Log4j2를 이용한 로깅(logging) 방법 - IV

hoazzinews 2024. 12. 12. 10:34

이번 시간에는 로그를 파일에 기록할 때 심각도(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 순입니다.

INFO 이상의 로그가 모두 동일한 파일에 기록 됩니다.

 

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 디렉터리에 심각도에 따라 파일일 분리됐는지 확인합니다.

심각도에 따라 파일이 분리 됐습니다.

 

파일을 메모장에서 확인해 보면 심각도에 따라 해당 로그만 기록된것을 확인할 수 있습니다.

'spring-app-debug.log' 파일에는 'DEBUG' 로그만 기록됩니다.
'spring-app-info.log' 파일에는 'INFO' 로그만 기록됩니다.
'spring-app-warn.log' 파일에는 'WARN' 로그만 기록됩니다.
'spring-app-error.log' 파일에는 'ERROR' 로그만 기록됩니다.

 

이번 시간에는 로그 심각도에 따라 파일을 분리하는 방법에 대해서 살펴봤습니다. 반듯이 심각도에 따라 파일을 분리해야 하는 것은 아닙니다. 프로젝트를 관리하는 내부 정책에 따라 유연하게 설정하면됩니다.

다음 시간에는 파일 용량이 커질 때 파일을 추가로 생성하는 방법에 대해서 살펴보겠습니다. 

 

이전 글: Log4j2를 이용한 로깅(logging) 방법 - III