Logback 라이브러리 설정

2023. 4. 24. 22:59JAVA/Spring

설정 파일

  • loback의 기본 설정 파일은 logback.xml 입니다.
  • logback 라이브러리는 classpath 아래에 위치하는 logback.xml을 기본으로 탐색합니다.

 

xml 파일에 로그 설정

logback.xml 파일에 다음과 같이 설정할 수 있습니다.

<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>

    <logger name="kr.codesqaud.cafe" level="DEBUG" />

</configuration>
  • 기본 로그 레벨은 info 레벨로 설정됩니다.
  • kr.codesquad.cafe 패키지의 로그 레벨은 debug 레벨로 설정됩니다.
  • 로그 출력 방식은 콘솔(ConsoleAppender)로 설정됩니다.

 

로그 레벨(log level)

로그 레벨은 다음과 같습니다.

TRACE < DEBUG < INFO < WARN < ERROR
  • 1) ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시됩니다.
  • 2) WRAN : 처리 가능한 문제, 향후 시스템 에러의 원이 될 수 있는 경고성 메시지를 표시합니다.
  • 3) INFO : 상태 변경과 같은 정보성 로그를 표시합니다.
  • 4) DEBUG : 프로그램을 디버깅하기 위한 정보를 표시합니다.
  • 5) TRACE : 추적 레벨은 DEBUG 레벨보다 훨씬 상세한 정보를 표시합니다.

 

로그 레벨의 특징

  • 최고 높은 레벨은 ERROR 레벨이고 최고 낮은 레벨은 TRACE 레벨입니다.
  • 출력 레벨의 설정에 따라 설정한 레벨 이상의 로그를 출력합니다.
  • 예를 들어 로그 레벨 설정을 "DEBUG"로 설정하면 출력되는 레벨은 "DEBUG", "INFO", "WARN", "ERROR" 레벨의 로그가 표시됩니다. DEBUG 레벨보다 낮은 레벨인 TRACE 레벨의 로그는 출력되지 않습니다.

 

로그 메시지 형식

설정 파일을 통해서 출력되는 로그 메시지 형식을 변경할 수 있습니다.

 

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  ...
</configuration>

위와 같은 로그 메시지 형식에서 다음과 같은 실행 결과가 나옵니다.

22:01:07.350 [http-nio-8080-exec-2] DEBUG k.c.c.a.q.c.QuestionController - hello listQuestion

 

소스 코드에서 SLF4J, Logback 사용하기

  • 소스 코드에서 사용하는 코드는 Logback 코드가 아닌 facade 역할을 수행하는 SLF4J를 사용해야 합니다. 그래야 추후 Logback보다 더 좋은 라이브러리가 나오면 소스 코드를 수정하지 않을 수 있습니다.

로그를 남기고 싶은 클래스에 다음과 같이 구현할 수 있습니다.

@RestController
public class QuestionController {

    private static final Logger log = LoggerFactory.getLogger(QuestionController.class);
    
    // ...
    
    @GetMapping({"/", "/qna"})
    public ModelAndView listQuestion() {
        log.debug("hello listQuestion");
        // ...
    }
}

 

SLF4J에서 성능을 고려한 로그 메시지 생성

  • 자바에서 문자열을 더하는 연산은 생각보다 많은 비용이 발생합니다.
잘못된 로그 메시지 생성       : log.debug("answer : " + answer);
성능을 고려한 로그 메시지 생성 : log.debug("answer : {}", answer);

 

인텔리제이의 SLF4J Tmpleate 추가하기

1. Preferences -> Editor -> Live Templates -> Java -> 라이브 템플릿 추가

 

 

2. 다음과 같이 SLF4J 템플릿을 입력합니다.

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger($CLASS_NAME$.class);

 

3. 변수 편집 -> 표현식 -> className() 선택

 

4. 하단에 정의 -> Java -> 선언 체크박스 선택

 

 

5. 실행 확인

 

 

Logback 사용시 알아두면 좋은 기능

  • 설정 파일을 XML 형식뿐만 아니라 Groovy도 지원합니다.
  • Automatic reloading of configuration files : 설정 파일을 변경시 지정된 시간이 지나게 되면 파일의 변경을 감지하고 다시 읽어들이도록 설정할 수 있습니다.
  • Automatic removal of old log archives : RollingFileAppender를 사용하면 일정 크기 단위, 일정 시간 단위로 로그 파일을 분리해 관리할 수 있습니다. 로그 파일을 계속 저장해 놓으면 용량이 부족한 상황이 발생할 수 있습니다. 이러한 단점을 보완하기 위해서 오래된 로그 파일을 자동으로 삭제하는 기능을 제공합니다.
  • Automatic compression of archived log files : 로그 파일을 자동으로 압축하는 기능을 제공합니다.

 

References

[스프링부트 (5)] Spring Boot 로그 설정(1) - Logback
[스프링부트] Spring Boot 로그 설정 - Logback