Spring
LogBack 설정하기
이번 포스팅에서는 LogBack은 무엇인지, 그리고 어떤 설정을 할 수 있는지 자세하게 알아보려 합니다.
Logback이란?
LogBack은 가장 많이 사용되고 있는 로깅 프레임워크 중 하나입니다. Logback은 이전에 많이 사용되고 있던 Log4j의 대안책으로 나온 slf4j와 그 구현체인데, slf4j는 패시드(Facade)패턴으로 구현체의 종류와 상관없이 일관된 로깅 코드를 작성할 수 있기 때문에 범용적입니다.
LogBack의 구성요소로는 Logger, Appender, Encoder 3가지가 있으며 다음과 같은 역할을 합니다.
- Logger: 실제 로깅을 수행한다. Level 속성으로 출력할 로그의 레벨을 정한다.
- Appender: 로그 메세지가 출력될 대상을 정한다.
- Encoder: Appender에 포함되어 어떤 형식으로 로그 메시지를 표현할지 결정한다.
LogBack 설정하기 (xml 방식)
1. LogBack Dependency를 설정한다. (gradle 기준)
Spring boot를 사용한다면 spring-boot-starter-web에 이미 포함되어 있기 때문에 dependency 설정은 넘어가도 무방합니다.
dependencies {
...
compile("ch.qos.logback:logback-classic:1.2.3")
...
}
2. LogBack xml을 설정한다.
resources폴더 아래에 logback.xml을 만듭니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 로그 레벨과 저장할 폴더 위치를 저장하고 있는 property 입니다. -->
<property scope="context" name="LOG_LEVEL" value="INFO"/>
<property scope="context" name="LOG_DIR" value="/var/log/"/>
<!-- 콘솔에 로그를 남깁니다. -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 파일에 로그를 남깁니다. -->
<appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/application.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 파일을 저장할 때 최대 30일간 1G의 로그만을 저장합니다. -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/application/log.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- 에러 일 경우 파일에 로그를 남깁니다 -->
<appender name="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>
<file>${LOG_DIR}/error.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%-5level] %logger{36} - %msg%n
</Pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 파일을 저장할 때 최대 30일간 1G의 로그만을 저장합니다. -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/application/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- com.test.application 패키지의 info레벨 로그를 Common, File, Error에 남깁니다. -->
<logger name="com.test.application" level="INFO" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="File"/>
<appender-ref ref="Error"/>
</logger>
</configuration>
Encoder 형식
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
(예시) 21:32:10.311 [main] DEBUG com.baeldung.logback.LogbackTests - Logging message: This is a String
|
RollingFileAppender 형식
<property name="LOG_FILE" value="LogFile" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
RollingPolicy는 그냥 동일한 파일에 로그 메세지를 추가하는 것이 아니라, 시간이나 로그 파일의 크기 등을 조합하여 파일에 롤을 정하는 일을 합니다.
예시와 같이, maxHistory를 지정할 경우, 최대로 저장할 수 있는 날짜를 지정할 수 있고, totalSizeCap을 지정할 경우 최대로 저장할 수 있는 데이터의 크기를 지정할 수 있습니다.
관련글
1.Logback 사용법
www.baeldung.com/logback
'개발 > Spring' 카테고리의 다른 글
Spring 트랜잭션 처리 (0) | 2021.04.18 |
---|---|
[Spring] DispatcherServlet 코드 분석하기 (0) | 2021.01.01 |
[Spring 프로젝트] Interceptor로 request, response body json 값 로깅하기 (1) | 2020.12.09 |
[Spring 프로젝트] Annotation 동작 원리와 사용법 (0) | 2020.12.07 |
[Spring 프로젝트] AOP Logging (Post 메서드의 Json Body 값 로깅하기) (0) | 2020.12.04 |