ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Logback 설정
    Backend/Spring 2022. 11. 16. 20:45
    애플리케이션 운영을 하기 위해서는 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

    댓글

Designed by Tistory.