Spring Boot Logback 설정


Spring Boot에서 Logback 이용해서 logging 설정하는 방법에 대해서 설명한다.
여기서 application.yml 을 이용한 설정방법은 설명 하지 않고, 기본 Logback을 확장해서 logback-spring.xml 을 이용한 방법에대해서 설명한다.

Logback 에 기본 설명은 하지 않는다. 기본설명에 대해서는 Logback 설정 을 참고 하길 바란다.

Maven Dependency

spring-boot-starter-web 만 추가해주면 된다.

pom.xml
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

logback-classic 이 종속되어있다.

Spring Boot logback 기본 구조

logback-spring.xml 생성

logback-spring.xml
1
2
3
4
5
<?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 경로를 따라가면 base.xml 에 포함된 코드를 확인해볼수 있다.

Spring Boot 에서 기본 으로 제공하는 logback 설정

  1. base.xml은 Spring Boot 에서 제공하는 기본 logback 설정 파일
  2. console-appender.xml은 console에 대한 appender 파일
  3. file-appender.xml은 file에 대한 appnder 파일
  4. default.xml은 property, logger 관련 파일
base.xml
1
2
3
4
5
6
7
8
9
10
<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
1
2
3
4
5
6
7
<included>
<appender name=“CONSOLE” class=“ch.qos.logback.core.ConsoleAppender”>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
</included>
file-appender.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<included>
<appender name=“FILE”
class=“ch.qos.logback.core.rolling.RollingFileAppender”>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class=“ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy”>
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
</rollingPolicy>
</appender>
</included>
file-default.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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=“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}}”/>

<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”/>
</included>

LogbackApplication.java 생성 후 실행

LogbackApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootApplication
public class LogbackApplication {

private static final Logger logger = LoggerFactory.getLogger(LogbackApplication.class);

public static void main(String[] args) {
SpringApplication.run(LogbackApplication.class, args);

logger.info("Sping boot Logback {}", LogbackApplication.class.getSimpleName());
}

}

결과 화면

Logback 확장 기능

springProfile 소개

springProfile을 이용해서 애플리케이션 배포할 서버마다 로그 단계랑 파일 저장설정에 대해서 설정을 할 수 있다.
이 기능을 하용하려면 logback-spring.xml.을 사용해야된다.

개발, 운영 2가지 상태가 있다고 가정을 하였다.

application-{profile}.yaml 생성

  • application-dev.yaml 개발 환경 파일
  • application-prod.yaml 운영 환경 파일

logback-spring.xml 생성

logback-spring.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

<!--로그 파일 저장 위치-->
<property name="LOG_FILE" value="C:/logs/logback/logback.log"/>
<property name="LOG_FILE_PROD" value="C:/logs/logback/logback-prod.log"/>

<springProfile name="dev">
<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>

<logger name="me.logback" level="debug" additivity="false">
<!-- ref="appender name 지정" -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</logger>
<root level="debug">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</root>
</springProfile>

<springProfile name="prod">
<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE_PROD}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PROD}.%d{yyyy-MM-dd}-prod</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>

<logger name="me.logback" level="debug" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING-FILE"/>
</logger>
<root level="info">
<appender-ref ref="ROLLING-FILE"/>
</root>
</springProfile>

</configuration>

실행

환경 설정에 따라 springProfile에 active 할 name을 지정해서 애플리케이션을 실행시키면 각 설정한 환경에 따라 log를 확인 할수있다.

  • <springProfile name = "dev"> 적용된 개발에 VM option 으로 -Dspring.profiles.active=dev 실행

로그 3번째 Activated activeProfiles dev 활성화 확인

  • <springProfile name = "prod"> 적용된 운영에 VM option 으로 -Dspring.profiles.active=prod 실행

로그 3번째 Activated activeProfiles prod 활성화 확인

생성된 파일 확인

실제 로그파일 저장위치를 <property name="LOG_FILE"><property name="LOG_FILE_PROD"> 로 설정했는데, 실제 서버 운영에는 각 저장소가 다르기때문에 같은 name으로 해도된다. 로컬에서 파일이름을 다르게 생성하기 위해서 설정한것이다.

소스코드

참조