신규 프로젝트를 진행하면서 오랜만에 logback 설정을 진행해서 간단한 개념과 사용법에 대해서만 정리를 하려고 한다. 해당 포스팅은 springboot 3.1.2, logback 1.4.8 버전에서 작성되었다.
1. Logback
Logback이란 스프링부트에서 로그 관리를 위해 SL4FJ를 구현한 구현체이다. 참고로 SL4FJ란 로깅을 위한 추상화된 인터페이스이다.
2. 설정방법
스프링부트에서 resources 폴더 안의 logback-spring.xml 파일을 읽어서 로깅 관련된 설정을 하는데 만약 해당 위치에 파일이 존재하지 않는다면 application.yml의 파일을 읽어서 처리를 진행한다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
// 설정..
</configuration>
로깅을 설정할 때는 기본적으로 xml 파일을 사용하며 configuration 속성을 루트로 가지는 구조이다. configuration 안에서 Appender, Encoder, Layout, Filter 등을 설정해야 원하는 형태로 로그 출력이 가능하다.
appender
appender는 적절한 출력 장치에 적절한 형식으로 로깅 이벤트를 출력하는 역할을 담당한다. 즉 로그를 콘솔에 출력할지, 파일로 출력할지, 이메일로 전송할 지 등을 appender를 통해 설정할 수 있다. appender 내의 layout과 encoder를 통해 로그 출력 형식을 설정할 수 있다.
ConsoleAppender
- 로그를 콘솔에 출력하는 Appender.
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
RollingFileAppender
- 로그를 파일에 출력하는 Appender인데 시간 또는 파일의 용량을 기준으로 로그 파일을 추가로 생성해주는 기능을 제공한다. RollingPolicy 와 TriggeringPolicy 로 정책 설정이 가능하고 아래의 예제는 RollingPolicy를 이용하여 로그 파일이 100MB를 넘어가면 새로운 파일을 만들어 로깅하는 정책이다.
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 파일명 -->
<file>${LOG_DIR}/${LOG_FILE_NAME}.log</file>
<!-- 롤링 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<!-- 로그출력 패턴 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
3. 전체 설정파일
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="LOG_FILE_NAME" value="tax-api"/>
<property name="LOG_PATTERN" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} : %30logger{5} - %msg%n"/>
<springProfile name="local">
<property name="LOG_DIR" value="C:\tax-log\local"/>
<property name="LOG_LEVEL" value="debug" />
</springProfile>
<springProfile name="develop">
<property name="LOG_DIR" value="/pub/log/tax-api"/>
<property name="LOG_LEVEL" value="debug" />
</springProfile>
<springProfile name="prod">
<property name="LOG_DIR" value="/pub/log/tax-api"/>
<property name="LOG_LEVEL" value="info" />
</springProfile>
<!-- ConsoleAppender 설정 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- FileAppender 설정 -->
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 파일명 -->
<file>${LOG_DIR}/${LOG_FILE_NAME}.log</file>
<!-- 롤링 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<!-- 로그출력 패턴 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 로그 전역 설정 -->
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING_FILE" />
</root>
</configuration>