애플리케이션 운영을 하기 위해서는 Log가 반드시 필요하고 Spring에서 Logback 설정을 통해 운영 하기 위한 Log를 관리할 수 있다.
Logback
- Slf4j(Simple Logging Facade for Java) 인터페이스를 구현하는 구현체이다.
- 한마디로, Logging Framework이다.
Appender 종류
- ConsoleAppender: 콘솔에 log 출력
- FileAppender: 파일 단위로 log 저장
- RollingFileAppender: 설정 옵션(시간 등...)에 따라 log를 여러 파일로 나누어 저장
- SMTPAppender: log를 메일로 전송하여 기록
- DBAppender: log를 DB에 저장
실습
1. logback-spring.xml 파일 생성
- logback-spring.xml 파일을 resources 폴더 아래에 생성한다.
- logback-spring.xml은 Root Logback 설정 파일 역할을 하도록 만들 것이다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
</configuration>
- 위와 같이 코드를 작성하고 Server를 실행하면, 기존 logback 설정이 사라졌기 때문에 아무런 Log도 출력되지 않는다.
2. logback-spring-local.xml 파일 생성
- logback-spring-local.xml 파일을 resources 폴더 아래에 생성한다.
- logback-spring-local.xml은 active-profile이 local일 경우 적용할 logback 설정 파일이다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
// Spring-Boot의 기본 logback 설정 파일 Include
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
// spring.profiles.active 설정 정보를 받아와 해당 설정 파일 Include
<include resource="logback-spring-${spring.profiles.active}.xml"/>
</configuration>
- logback-spring.xml 파일을 위와 같은 코드로 변경한다.
<included>
// Console Appender가 설정되어 있는 파일 Include
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<root level="INFO"> # Logging Level 설정
<appender-ref ref="CONSOLE"/> // Include 받은 CONSOLE Appender 사용
</root>
</included>
- logback-spring-local.xml 파일에 위와 같은 코드를 작성한다.
- 애플리케이션의 Active profiles를 local로 설정한 후 Server를 실행한다.
- 위와 같이 기존 로그가 출력되는 것을 확인할 수 있다.
3. Log 출력 커스텀하기
* Pattern
- %d: 로그 기록 시간 출력
- %-5level: %level만 사용해도 되고, -5는 5글자 고정 출력
- %logger: logger 이름. %logger{num}으로 출력 package 길이 조절
- %replace: replace로 내용을변경
- %msg: 메세지 출력
- %n: 줄 바꿈
- %thread: 스레드 출력
- %line: 줄 출력
<included>
<appender name="CONSOLE2" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<layout>
<pattern>
[CONSOLE2] [%-5level] %d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{0}:%line] - %msg%n
</pattern>
</layout>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE2"/>
</root>
</included>
- 위와 같이 logback-spring-local 파일을 작성한다.
- Custom된 Log를 확인할 수 있다.
4. Log File로 저장하기
<included>
<appender name="TEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/test.log</file> // Log가 저장될 파일
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern> // test.log에 maxFileSize 만큼 Log가 쌓이면 나눠서 저장할 Log File 이름
logs/archive/test.%d{yyyy-MM-dd}_%i.log
</fileNamePattern>
<maxFileSize>1KB</maxFileSize> // Log File 최대 크기
<maxHistory>30</maxHistory> // Log File 최대 관리 주기
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
[TEST] [%-5level] %d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{0}:%line] - %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="TEST"/>
</root>
</included>
- logback-spring-local 파일에 위와 같은 코드를 작성한다.
- RollingFileAppender를 사용하여 rollingPolicy 설정 대로 Log 파일을 분할해서 관리할 수 있다.
Mdc
- 멀티스레드 환경에서 로그를 남길 때 사용하는 개념이다.
- 멀티스레드 환경에서는 스레드가 컨텍스트 스위칭이 발생하기 때문에, 로그를 남길 때 꼬일 수 있다.
- 각 스레드마다 가지고 있는 고유의 값을 logback으로 전달해줄 때 사용하는 개념
- 값을 logback 설정에서 동적으로 가져와 사용할 수 있도록 도와준다.
MDC.put("job", "dev");
log.trace("Log -> Trace");
log.debug("Log -> Debug");
log.info("Log -> Info");
log.warn("Log -> Warm");
log.error("Log -> Error");
MDC.clear();
- slf4j 패키지 내의 존재하는 MDC를 사용한다.
- 메서드가 종료될 때, MDC를 항상 clear 해줘야 한다.
<appender name="MDC" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/mdc.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern><!-- Log File Name 설정 -->
${LOG_DIR}/archive/mdc.%d{yyyy-MM-dd}_%i.log
</fileNamePattern>
<maxFileSize>1KB</maxFileSize> <!-- Log File 최대 크기 -->
<maxHistory>30</maxHistory> <!-- Log File 최대 관리 주기 -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
[MDC] %X{job}%n
</pattern>
<outputPatternAsHeader>true</outputPatternAsHeader> <!-- Log File에 Pattern 정보를 기록한다 -->
</encoder>
</appender>
- %X를 사용하면 MDC를 사용할 수 있다.
- %X{Key}: MDC에 저장된 Key에 해당하는 Value를 출력할 수 있다.
'Backend > Spring' 카테고리의 다른 글
[Spring] checkstyle 적용하기 (0) | 2023.05.03 |
---|---|
DDD(Domain Driven Design)란? (1) | 2023.04.03 |
[Spring] Rest-Docs 연결 (0) | 2023.01.13 |
[Spring] 알림 기능에 SSE 적용하기 (0) | 2022.11.25 |
[Slf4j] Slf4j란? (0) | 2022.09.19 |