본문 바로가기
Spring

SpringBoot - LogBack 관련 개념 및 설정 방법 (2)

by devLog by Ronnie's 2023. 1. 29.

지난 시간에는 개념에 대해서 정리하였고 이번 시간에는 기본으로 제공되는 logback을 확장하여 사용하는 방법에 대해서 정리한다.

 

SpringBoot - LogBack 관련 개념 및 설정 방법 (2)

 

SpringBoot - LogBack 관련 개념 및 설정 방법 (2)

 

설정 방법


먼저 가장 기본이 될 default log 설정 xml 파일을 생성해준다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>

여기서 보이는 org/springframework/boot/logging/logback/base.xml 경로를 따라가보면 스프링부트에서 기본으로 제공하는 logback 관련 설정들을 확인할 수 있다.

다음과 같이 xml 파일이 4가지가 존재하는데 하나씩 살펴보면

 

base.xml 은 기본 logback 설정 파일이다.

<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>

 

console-appender.xml 은 말 그대로 콘솔에 대한 appender 설정 파일이다.

<included>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>${CONSOLE_LOG_CHARSET}</charset>
		</encoder>
	</appender>
</included>

 

file-appender.xml 도 마찬가지로 파일에 대한 appender 파일이며,

<included>
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset>${FILE_LOG_CHARSET}</charset>
		</encoder>
		<file>${LOG_FILE}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
			<cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
			<maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
			<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
			<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
		</rollingPolicy>
	</appender>
</included>

 

default.xml 파일은 프로퍼티 및 logger 설정과 관련된 파일이다.

<included>
	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
	<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
	<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
	<property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>

	<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
	<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
	<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
	<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
	<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
	<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
	<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
	<logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/>
</included>

 

이렇게 제공되어 지는 설정만으로도 콘솔에 로그는 잘 찍힌다. 하지만 보통 개발을 할때는 개발 환경을 나눠서 개발을 하게 된다.

보통 개발(dev)환경, 스테이지(stage) 환경, 운영(prod)환경으로 나눠서 개발을 하게 되는데 여기서는 개발과 운영 환경으로만 나뉘어져 있다는 가정하에 설명을 이어가겠다.

 

스프링에서는 application-{profile}과 같이 개발 환경을 나눠 설정을 달리할 수 있으며 로그 설정 또한 환경별로 나눠서 설정이 가능하다.

 

설정 예시로는 기본설정과 로컬 설정만 분리하여 적용하는 방법에 대해서 정리한다. (다른 환경도 다음 예시와 같이 설정하면 됨.)

 

 

먼저 default-log.xml 부터 알아본다.

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="STANDARD_OUTPUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </layout>
    </appender>

    <appender name="DEFAULT_ERROR_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEFAULT_ERROR_LOG_HOME}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${DEFAULT_ERROR_LOG_HOME}/archived/error.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${DEFAULT_MAX_FILESIZE:-500MB}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <springProfile name="!prod">
                <maxHistory>${DEFAULT_MAX_HISTORY:-10}</maxHistory>
            </springProfile>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="DEFAULT_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEFAULT_LOG_HOME}/api.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${DEFAULT_LOG_HOME}/archived/api.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${DEFAULT_MAX_FILESIZE:-500MB}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <springProfile name="!prod">
                <maxHistory>${DEFAULT_MAX_HISTORY:-10}</maxHistory>
            </springProfile>
<!--            <springProfile name="prod">-->
<!--                <maxHistory>${PROD_MAX_HISTORY:-90}</maxHistory>-->
<!--            </springProfile>-->
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <springProfile name="!prod">
                <level>INFO</level>
            </springProfile>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <logger name="org.springframework" level="INFO"/>
</included>

 

 

위에서 부터 하나씩 알아보자.

 

 

다음 어펜더는 콘솔 출력창에 대한 출력 패턴을 정의할 수 있는 설정이다. 

    <appender name="STANDARD_OUTPUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </layout>
    </appender>

 

${CONSOLE_LOG_PATTERN} 과 같이 변수로 뺀 설정은 로그에 대한 상수 설정 xml 파일로 따로 분리해서 다음과 같이 property로 설정을 해주면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<included>

    <!-- 콘솔 로그 패턴 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

</included>

 

이제 그 아래로 보이는 ERROR_LOG_APPENDER와 LOG_APPENDER가 보인다. 둘의 차이는 로그 레벨을 달리하여 error 레벨로 찍히는 에러 로그와 일반 로그를 따로 구분하여 보기 위한 설정이다. 하나의 로그 파일에서 모든 로그 레벨을 찍어서 보게되면 모든 로그 레벨이 섞여있기 때문에 보통 error 레벨은 따로 분리하여 로그를 남긴다.

 

둘의 설정의 차이는 하나의 로그 설정 설명만 들어도 충분히 이해가 가능하므로 예시로 LOG_APPENDER의 대한 설정에 대해서 정리한다.

 

 

다음 설정은 해당 로그파일을 어느 경로에 대해서 저장할 것인지에 대한 설정이며 원하는 경로에 저장이 가능하다.

        <file>${DEFAULT_LOG_HOME}/api.log</file>

 

다음 부분에서는 일자별로 로그 파일을 압축 파일형태로 저장하는 것과 로그 파일 크기가 너무 커지는 것을 방지하기 위한 maxFileSize 설정 부분이 있다. 그리고 springProfile 태그를 통해서 application.yml 환경에 따라서 설정이 가능하다. 주석이 되어 있지 않은 springProfile name="!prod"에서는 prod가 아닌 나머지 환경에 대한 설정이며 주석이 되어 있는 곳은 prod 환경에 대한 설정이다. 

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${DEFAULT_LOG_HOME}/archived/api.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${DEFAULT_MAX_FILESIZE:-500MB}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <springProfile name="!prod">
                <maxHistory>${DEFAULT_MAX_HISTORY:-10}</maxHistory>
            </springProfile>
<!--            <springProfile name="prod">-->
<!--                <maxHistory>${PROD_MAX_HISTORY:-90}</maxHistory>-->
<!--            </springProfile>-->
        </rollingPolicy>

 

이렇게 환경별로 나눠서 maxHistory를 통해 보관기간을 달리 설정할 수 있다.

 

자 이렇게 설정을 하였다면 일단 기본이 될 로그 설정이 완료되었으며 이제 환경별로 설정을 해주면 된다.

 

 

local-log.xml 파일을 만들어 다음과 같이 설정을 해주면 해당 환경에서 위에서 만들어주었던 appender들을 사용할 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <include resource="logs/log-constant.xml"/>
    <include resource="logs/default-log-setting.xml"/>

    <root level="INFO">
        <appender-ref ref="STANDARD_OUTPUT"/>
        <appender-ref ref="DEFAULT_LOG_APPENDER"/>
        <appender-ref ref="DEFAULT_ERROR_LOG_APPENDER"/>
    </root>
</configuration>

 

기본 로그 설정과 상수 설정의 xml 경로는 include 해주고 설정한 appender 들을 appender-ref 태그로 설정이 가능하다.

 

이렇게 동일하게 dev, stage, prod 환경별로 xml 파일을 나누어 설정하여 로그 레벨, 로그 파일 저장 경로, 로그 패턴, 로그 저장 기간, 로그 파일 사이즈 등을 달리 설정이 가능하다.

 

지난 글


SpringBoot - LogBack 관련 개념 및 설정 방법 (1)

 

SpringBoot - LogBack 관련 개념 및 설정 방법 (1)

들어가며 스프링부트를 사용 시 컴파일을 돌리다보면 아주 친절하게 줄맞춤까지 되서 로그를 찍어주는 것을 봤을 것이다. 평소에는 당연하듯이(?) 사용하였는데 좀 더 디테일하게 알아보고자

sjparkk-dev1og.tistory.com

 

댓글