스프링 부트 환경에서 기본적으로 포함되는 로깅 라이브러리인 logback
에 대한 내용들을 정리해보려 합니다.
logback
은 log4j 1.x
버전에서 제공하는 기능을 보완하고 성능적으로도 향상시킨 로깅 시스템입니다.
logback
은 3가지 모듈을 통해 다양한 기능을 제공합니다.
logback-core
Appender 와 Layout 인터페이스가 존재하는 모듈
logback-classic
logback-core
와 SLF4J
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 레벨의 로그만 출력된다.
logback
을 설정하기 위한 방식에는 여러 방식이 있지만 해당 포스트에서는 사람들이 많이 사용하는 3가지 방식에 대해 서술하려한다.
logging:
level:
root: info
web: debug
appenders:
console:
pattern: "%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n"
프로젝트 설정 파일인 .properties
나 .yaml
파일에 설정하는 방법으로, 간단한 설정을 할 때 많이 사용한다.
<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 기준으로 작성하려합니다.
본격적으로 설정 전 기본 구성을 확인하고 넘어가겠습니다.
기본적인 구조는 위 이미지와 같습니다.
<configuration>
태그는 내부에 최대 1개의 <root>
태그를 갖고, 0개 이상의 <appender>
와 <logger>
태그를 가질 수 있습니다.
태그 명명 규칙은 대소문자를 구분하며 camelCase 를 따르도록 합니다.
루트 로거는 <root>
태그를 통하여 구성됩니다. 루트 로거의 속성으로는 오직 단 하나의 level 속성만 허용 됩니다.
루트 로거의 이름은 이미 "ROOT"로 정해져 있기에 name 속성도 포함하지 않습니다.
level
속성으로는 기존 logger와 동일하게 level 값들을 가질 수 있습니다.
하지만, 가장 최상단의 로거이기 때문에 INHERITED 혹은 NULL 값은 level 값으로 가질 수 없습니다.
로그를 출력할 위치, 출력 형식 등을 설정하는 구성 요소
Appender는 <appender>
태그를 통하여 구성되며 name와 class 속성을 필수적으로 가져야만 합니다.
name
속성은 appender의 이름을 명시하며, class
속성은 인스턴스화 시킬 appender 클래스를 명시하여야 합니다.
<appender>
태그는 0개 또는 1개의 <layout>
태그와 0개 이상의 <encoder>
와 <filter>
태그를 가질 수 있습니다.
또한, <appender>
태그는 JavaBean으로 등록된 appender 클래스를 다수 포함할 수 있습니다.
Console Appender
System.err
또는 System.out
에 추가합니다. 이때, 사용자가 지정한 인코더를 사용해 이벤트 형식을 지정합니다.File Appender
RollingFile Appender
File Appender
를 상속하며 파일을 롤오버하는 기능으로 확장합니다.SMTP Appender
Custom Appender
appender
로 AppenderBase<ILoggingEvent>
를 상속해 클래스를 작성하고, logback.xml
에서 해당 appender
를 적용한다.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는 명명된 로거에 추가됩니다.
위에서 소개한 구성 요소 외 다른 구성요소들은 공식문서 에서 확인하여 사용하시길 바랍니다.