Logback 알아보기

Daniel·2024년 11월 25일
0

Back-End

목록 보기
45/48

들어가며

스프링 부트 환경에서 기본적으로 포함되는 로깅 라이브러리인 logback 에 대한 내용들을 정리해보려 합니다.

Logback 란?

logbacklog4j 1.x 버전에서 제공하는 기능을 보완하고 성능적으로도 향상시킨 로깅 시스템입니다.

logback 은 3가지 모듈을 통해 다양한 기능을 제공합니다.

  • logback-core
    AppenderLayout 인터페이스가 존재하는 모듈

  • logback-classic
    logback-coreSLF4J API 라이브러리를 포함하고 있음, Logger 클래스가 포함된 모듈

  • logback-access
    Servlet Container 와 통합되어 HTTP 엑세스에 대한 로깅 기능을 제공. Container 레벨에서 사용합니다.
    사용하기위해서는 명시적인 의존성 추가가 필요합니다. implementation("ch.qos.logback:logback-access")

로그 레벨

Logging 시 5가지의 레벨이 존재하며, 설정을 통해 원하는 레벨의 로그만을 출력할 수 있습니다.

ERROR
예상하지 못한 심각한 문제가 발생하는 경우, 즉시 조취를 취해야 할 수준의 레벨

WARN
로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리, 당장 서비스 운영에는 영향이 없지만 주의해야 할 부분

INFO
운영에 참고할만한 사항, 중요한 비즈니스 프로세스가 완료됨

DEBUG
개발 단계에서 사용하며, SQL 로깅을 할 수 있음

TRACE
모든 레벨에 대한 로깅이 추적되므로 개발 단계에서 주로 사용한다.

로그 레벨 유효 범위

TRACE < DEBUG < INFO < WARN < ERROR

로그 레벨이 TRACE 인 경우,
: 모든 레벨에 대해서 로그가 기록된다.

로그 레벨인 INFO 인 경우,
: INFO <= level 즉, INFO , WARN , ERROR 레벨의 로그만 출력된다.

설정을 위한 3가지 구성 방식

logback 을 설정하기 위한 방식에는 여러 방식이 있지만 해당 포스트에서는 사람들이 많이 사용하는 3가지 방식에 대해 서술하려한다.

.properties / .yaml 구성

  • 구문 예
logging:
	level:
		root: info
		web: debug
	appenders:
		console:
			pattern: "%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n"

프로젝트 설정 파일인 .properties.yaml 파일에 설정하는 방법으로, 간단한 설정을 할 때 많이 사용한다.

.xml 구성

  • 구문 예
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
		
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

logback-spring.xml 이나 logback.xml 파일로 설정하는 방식으로 구글링 해보면 가장 자료가 많고 접근하기 쉽습니다.
일부 logback 설정은 XML 에서만 지원될 수 있으므로, XML 구성 방식을 많이 사용하는 편입니다.

프로그래밍 구성

  • 구문 예
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.ConsoleAppender;
import org.slf4j.LoggerFactory;

public class LogbackConfig {
    public static void configure() {
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setContext(context);
		
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(context);
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n");
        encoder.start();
		
        consoleAppender.setEncoder(encoder);
        consoleAppender.start();
		
        context.getLogger("ROOT").addAppender(consoleAppender);
    }
}

프로그래밍 방식으로 설정하는 방식이며, 외부 구성 파일에 대한 의존이 허용되지않는 환경이면 선택해볼만한 방식입니다.

그래서 어떤 방식으로 설정하는게 좋을까?

가장 많이 사용하는 방식이 XML 방식이고, 구글링으로 정보를 찾기도 쉬워서 해당 포스트에서는 XML 기준으로 작성하려합니다.

Logback 기본 구성 (.xml)

본격적으로 설정 전 기본 구성을 확인하고 넘어가겠습니다.

기본적인 구조는 위 이미지와 같습니다.

<configuration> 태그는 내부에 최대 1개의 <root> 태그를 갖고, 0개 이상의 <appender><logger> 태그를 가질 수 있습니다.
태그 명명 규칙은 대소문자를 구분하며 camelCase 를 따르도록 합니다.

root

루트 로거는 <root> 태그를 통하여 구성됩니다. 루트 로거의 속성으로는 오직 단 하나의 level 속성만 허용 됩니다. 
루트 로거의 이름은 이미 "ROOT"로 정해져 있기에 name 속성도 포함하지 않습니다.
level 속성으로는 기존 logger와 동일하게 level 값들을 가질 수 있습니다.
하지만, 가장 최상단의 로거이기 때문에 INHERITED 혹은 NULL 값은 level 값으로 가질 수 없습니다.

appender

로그를 출력할 위치, 출력 형식 등을 설정하는 구성 요소

Appender는 <appender> 태그를 통하여 구성되며 name와 class 속성을 필수적으로 가져야만 합니다. 
name 속성은 appender의 이름을 명시하며, class 속성은 인스턴스화 시킬 appender 클래스를 명시하여야 합니다.
<appender> 태그는 0개 또는 1개의 <layout> 태그와 0개 이상의 <encoder><filter> 태그를 가질 수 있습니다.
또한, <appender> 태그는 JavaBean으로 등록된 appender 클래스를 다수 포함할 수 있습니다.

appender 종류

Console Appender

  • logging 이벤트를 System.err 또는 System.out 에 추가합니다. 이때, 사용자가 지정한 인코더를 사용해 이벤트 형식을 지정합니다.
  • 콘솔에 출력하는 appender 라고 생각하면 쉬울 것 같다.

File Appender

  • logging 이벤트를 파일에 추가합니다. 대상 파일은 파일 옵션을 통해 지정되며 속성에 따라 파일이 추가되거나 분할됩니다.

RollingFile Appender

  • File Appender 를 상속하며 파일을 롤오버하는 기능으로 확장합니다.
  • 날짜별 로그파일 작성, 시간별 로그파일 작성 등을 원할때 사용합니다.

SMTP Appender

  • 하나 이상의 고정 버퍼에 로깅 이벤트를 누적하고 사용자 지정 이벤트가 발생한 이후 해당 버퍼의 내용을 이메일로 발송합니다.

Custom Appender

  • 사용자가 직접 구현하는 appenderAppenderBase<ILoggingEvent> 를 상속해 클래스를 작성하고, logback.xml 에서 해당 appender 를 적용한다.

logger

log를 남길 대상을 설정하는 구성 요소, appender 와의 조합으로 특정 classpath 는 콘솔에 로그를 남기고, 어떤 로그는 에러 발생시 이메일을 발송하고, 어떤 상황에서는 custom 한 로그 이벤트 처리를 할 수 있도록 다양한 처리를 가능하도록 구성할 수 있습니다.

<!-- org.example.loggingtest 경로에서 발생하는 모든 log 이벤트는 debug 로 남기고, 이벤트 처리는 STDOUT 라는 이름의 appender 가 처리할꺼야 -->  
<logger name="org.example.loggingtest" level="debug">  
    <appender-ref ref="STDOUT" />  
</logger>

Logger는 <logger> 태그를 통하여 구성됩니다. <logger>는 필수 name속성, 선택적으로 level 속성과 additivity 속성을 가집니다.
level 속성은 대소문자를 구분하지 않으면 TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF 중 하나의 값으로 지정할 수 있습니다. 특별한 level 값으로는 INHERITED 또는 NULL (같다)이 존재하는데, 이는 자신이 상속하는 상위 로거의 level을 그대로 따릅니다.
additivity 속성은 true와 false의 값을 가질 수 있습니다. 이는 appender의 cumulative 속성에 대하여 설정합니다.

<logger> 태그는 0개 이상의 <appender-ref> 태그를 포함할 수 있습니다.
<appender-ref> 태그로 포함된 appender는 명명된 로거에 추가됩니다.

위에서 소개한 구성 요소 외 다른 구성요소들은 공식문서 에서 확인하여 사용하시길 바랍니다.

참고

https://logback.qos.ch/

profile
응애 나 애기 개발자

0개의 댓글