본문 바로가기

ComputerScience/Java

[Java] Logback - 로깅 라이브러리

Logging

Logging(로깅)이란 애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것을 의미합니다.

로깅은 개발 영역 중 '비기능 요구사항'에 속합니다. 즉 필수적인 기능은 아니나, 로깅은 디버깅하거나 갭라 이후 발생한 문제를 해결할 때 원인을 분석하는 데 유용합니다.

자바 진영에서 가장 많이 사용되는 Logging 프레임워크는 Logback입니다.

Logback

Logback은 *log4j 이후에 출시된 로깅 프레임워크로서 *slf4j를 기반으로 구현됐으며, 과거에 사용되던 Log4j에 비해 월등한 성능을 자랑합니다.

*log4j: Apache log4j는 Java 기반의 로깅 유틸리티로서, 로그를 파일, 콘솔, HTML, 데이터베이스 등 다양한 대상에 출력할 수 있습니다.

*slf4j (Simple Logging Facade for Java): slf4j는 여러 로깅 프레임워크(log4j, java.util.logging, Logback 등) 사이의 추상화 된 퍼사드(facade) 또는 래퍼(wrapper)를 제공합니다. 이를 통해 개발자는 로깅 프레임워크를 쉽게 교체할 수 있습니다.

Logback의 특징은 다음과 같습니다.

  • 크게 5개의 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR)를 설정할 수 있습니다.
  • 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그를 확인할 수 있습니다.
  • Logback의 설정 파일을 일정 시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정을 변경할 수 있습니다.
  • 별도의 프로그램 지원 없이도 자체적으로 로그 파일을 압축할 수 있습니다.
  • 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리할 수 있습니다.

Logback의 로그 레벨

  • ERROR: 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우를 의미합니다.
  • WARN: 시스템 에러의 원인이 될 수 있는 경고 레벨을 의미합니다.
  • INFO: 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용됩니다.
  • DEBUG: 애플리케이션의 디버깅을 위한 메시지를 표시하는 레벨을 의미합니다.
  • TRACE: DEBUG 레벨보다 더 상세한 메시지를 표현하기 위한 레벨을 의미합니다.

Logback의 영역

Logback은 Property, Appender, Encoder, Pattern, Root 요소로 나뉩니다.

Property

  • Logback 설정에서 사용할 수 있는 속석을 정의하는 영역입니다.
  • 여기서 정의된 속성은 설정 파일내에서 재사용될 수 있습니다.

Appender

Appender 영역은 로그의 형태를 설정하고 어떤 방법으로 출력할지를 설정하는 곳입니다.

Appender 자체는 하나의 인터페이스를 의미하며, 하위에 여러 구현체가 존재합니다.

Logback의 설정 파일을 이용하면 각 구현체를 등록해서 로그를 원하는 형식으로 출력할 수 있습니다.

Appender의 대표적인 구현체는 다음과 같습니다.

  • ConsoleAppender: 콘솔에 로그를 출력
  • FileAppender: 파일에 로그를 저장
  • RollingFileAppender: 여러 개의 파일을 순회하면서 로그를 저장
  • SMTPAppender: 메일로 로그를 전송
  • DBAppender: 데이터베이스에 로그를 저장

Encoder

  • 로그를 사람이 읽기에 친숙한 포맷으로 변환합니다.(e.g., text, JSON)
  • Appender 내에서 로그 이벤트를 어떻게 변환할지 정의합니다.

Pattern

  • 로그 메시지의 출력 형식을 지정합니다.
  • Pattern은 Encoder 내에서 지정됩니다.
  • %date, %level, %logger, %msg과 같은 패턴을 사용하여 출력할 수 있습니다.

Root

  • Logger 레벨의 최상층을 나타냅니다.
  • Root 영역에서 Appender를 참조해서 로깅 레벨을 설정합니다.

Logback 사용 예시

logback.xml

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyExample {

    private static final Logger logger = LoggerFactory.getLogger(MyExample.class);

    public static void main(String[] args) {
        logger.debug("This is a debug message");
        logger.info("This is an info message");
        logger.warn("This is a warning message");
        logger.error("This is an error message");
    }
}
2024-02-22 23:50:49.999 [main] INFO  com.example.MyExample - This is an info message
2024-02-22 23:50:49.999 [main] WARN  com.example.MyExample - This is a warning message
2024-02-22 23:50:49.999 [main] ERROR com.example.MyExample - This is an error message

스프링 부트에서 사용하기

스프링 부트의 spring-boot-starter-web 라이브러리에는 이미 Logback 프레임워크가 내장되어 있습니다.

또한 스프링 부트는 다음의 이름으로 resource 패키지 안에서 Logback 설정 파일을 찾습니다.

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

참고 자료