본문 바로가기

Backend/Spring

[Spring] Logback 설정

애플리케이션 운영을 하기 위해서는 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