코딩항해기

[Spring] Logback을 통한 로그 관리 기초 (@Slf4j) 본문

Spring

[Spring] Logback을 통한 로그 관리 기초 (@Slf4j)

miniBcake 2024. 10. 12. 17:00

 

 

Logback

Logback은 Java에서 가장 많이 사용됐던 로깅 라이브러리인 log4j의 후속 버전으로 log4j의 아키텍처를 기반으로 재작성했으므로 완성도가 높다. 또한 Slf4j를 지원하기 때문에 마음에 들지 않으면 언제든지 다른 로거로 스위칭할 수 있도록 구성되어있다. Logback을 통해 로그를 관리하면 로그 색상 변경, 로그 레벨 설정, 로그 파일 저장 등등 다양한 기능을 사용할 수 있다.

 

log4j대비 장점

Logback에 SiftingAppender는 Filter의 기능화 유사하면서 다른 기능을 제공한다. 로그파일을 특정 주제별로 분류 하며, HTTP Session별로 파일을 저장한다거나 사용자별로 별도의 로그파일을 저장 할 수 있는 기능을 제공한다.
Logback은 Exception 발생시 참조했던 외부 라이브러리 버전까지 출력한다.
Logback은 별도의 삭제 스케줄러 설정및 개발이 필요없이 maxHistory라는 설정을 통해 주기적으로 Archive 파일을 자동 삭제 하는 기능이 있다.
Logback은 어플리케이션을 중지 시켰다가 재가동하더라도 서버 중지 없이, 이전 시점부터 복구를 지원한다.
Logback은 로그 레벨 변경시 내부 스캐닝하는 별도의 쓰레드가 있어 서버 재기동을 할 필요가 없다.

JAVA Logging 라이브러리 비교

현재 java에서 주로 사용되는 Logging 라이브러리는 Log4j, Logback, Log4j2를 주로 사용하며, 개발된 순서또한 Log4j, Logback, Log4j2 와 같다. 현재 Log4j는 2015년 8월 5일 기준으로 프로젝트 진행 종료가 된 상태이며, Log4j2로 업그레이드 하는것을 권고하고있다. 멀티쓰레드시 18배 이상의 성능차이가 나게되므로 프로젝트 성격에 따라 맞는 Logging 라이브러리를 선택하면 된다. Spring Boot의 경우 Logback 라이브러리를 기본적으로 포함한다.

 

 

로그 레벨 종류

ERROR (log.error())

: 요청을 처리하는 중 오류가 발생한 경우 표시한다.
WARN (log.warn())

: 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메세지를 나타낸다.
INFO (log.info())

: 상태변경과 같은 정보성 로그를 표시한다.
DEBUG (log.debug())

: 프로그램을 디버깅하기 위한 정보를 표시한다.
TRACE (log.trace())

: 추적 레벨은 Debug보다 훨씬 상세한 정보를 나타낸다.

 

로그에 설정할 수 있는 레벨은 총 5가지이며, ERROR - WARN - INFO - DEBUG - TRACE 순으로 높은 레벨을 나타낸다. 또한 출력레벨의 설정에 따라 설정 레벨 이상의 로그를 출력한다.
주의할 점은 로깅 레벨 설정을 "INFO"로 하였을경우 "TRACE", "DEBUG" 레벨의 로그는 출력되지 않는다. (default INFO)

 

기본설정 출력

package test;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;

@Slf4j
public class TestSlf4j {
    public static void main(String[] args) {
        int num = 1;
        String msg = "String";
        ArrayList<String> list = new ArrayList<>();
        list.add("list");

        log.warn("warn message [{}]", num);
        log.info("info message [{}]", msg);
        log.error("error message [{}]", list);
        test();
    }

    private static void test(){
        log.info("info message [한글 123 ABC]");
        log.error("error message [한글 123 ABC]");
        log.warn("warn message");
        log.trace("trace message");
        log.debug("debug message");
    }
}

 

Java application

 

Logback 설정하기

resources 폴더에 logback.xml (SpringBoot는 logback-spring.xml) 파일을 만들어 설정할 수 있다.

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %5level %logger - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

 

appender 태그를 통해 CONSOLE이라는 이름의 ConsoleAppender를 생성할 수 있으며, 종류는 ConsoleAppender, FileAppender, RollingFileAppender, SMTPAppender, DBAppender 등이 있다. 그 중 ConsoleAppender는 로그를 콘솔에 출력할 수 있게 한다.

 

root level를 통해 설정을 변경할 레벨을 지정할 수 있다.

appender-ref 태그를 통해서는 출력할 appender를 지정할 수 있다. 

 

로그 작성 pattern

패턴 설명
%logger{length} Logger 이름을 최대 length 글자로 축약
%-5level 로그 레벨, 고정폭 5글자
%msg 로그 메시지 (=%message)
${PID:-} 프로세스 아이디
%d 로그 기록 시간
%p 로깅 레벨
%F 로깅이 발생한 프로그램 파일명
%M 로깅이 발생한 메소드명
%I 로깅이 발생한 호출지의 정보
%L 로깅이 발생한 호출지의 라인 수
%thread 현재 Thread 명
%t 로깅이 발생한 Thread 명
%c 로깅이 발생한 카테고리
%C 로깅이 발생한 클래스 명
%m 로그 메시지
%n 줄바꿈
%% % 문자 출력
%r 애플리케이션 시작 이후부터 로깅 발생 시점까지의 시간(ms)

 

 

지금 설정으로 실행하면 모든 debug가 전부 출력되므로 logger 태그로 범위를 지정하는 것이 일반적이다. (root level = INFO)

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %5level %logger - %msg%n</pattern>
        </encoder>
    </appender>
    <!--name에 debug레벨 로그를 띄울 패키지명 작성-->
    <logger name="test" level="DEBUG" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

 

그 외에도 색상을 17개의 색상을 지원하고 있어 pattern에 해당 색상으로 설정을 추가할 수 있다.

%black", "%red", "%green", "%yellow", "%blue", "%magenta", "%cyan", "%white", "%gray", "%boldRed", "%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta", "%boldCyan", "%boldWhite" and "%highlight"
<pattern>%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) %magenta([%thread]) %highlight(%5level) %cyan(%logger) - %yellow(%msg%n)</pattern>

 

 

세부 설정을 건드리지 않고 가장 기본 설정과 유사한 pattern은 다음과 같았다.

(하이라이트는 기본 세팅된 설정을 타고 들어가 수정할 수 있다. defaults.xml에 crl에 정의되어있다.)

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

 

//이건 앞으로 쓰려고 기록해두는 설정

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%boldWhite(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

 

 

 

(@Slf4j가 롬복 기능이므로 eclipse는 해당 게시글 참조)

 

[Error/Lombok] eclipse에서 Lombok 정상구동 하지 않을 때

인텔리제이를 사용하고 있어서 롬복 사용에 불편함을 느끼지 못하고 logback 등등 편하게 사용하고 있었는데 코드를 공유하면서 보니 이클립스에서 logback 오류가 발생하는 것을 알게 됐다. 1. 의

minibcake.tistory.com

 

 

 

참고 블로그 [spring boot관련 내용 포함] : https://agileryuhaeul.tistory.com/entry/Logback-%EC%9D%B4%EB%9E%80

참고 블로그 [더욱 상세한 설정] : https://breakcoding.tistory.com/400