logback 이란?
logback은 log4j의 후속버전으로 logging 대표적인 라이브러리이다.
설정은 간단히 xml파일로 가능하며 적은 메모리를 점유하고 빠른 이행이 특징이 있다.
스프링 부트 환경에서 logback 로그를 찍어보기
implementation 'org.springframework.boot:spring-boot-starter'
spring-boot-starter 에는 기본적으로 starter-logging이 포함되어 있다.
Gradle dependencies를 살펴보면 starter-logging안에 logback,log4j,slf4j가 포함되 있는 것을 확인 가능하다.
사용하고 있지 않다면 logging 사용을 위해 build.gradle 파일에 라이브러리를 추가해 준다.
dependencies안에 의존성을 추가해 주면 되는데 오른쪽 상단에 코끼리모양의 그래들탭에서 리로드를 실행하면 자동으로 라이브러리가 추가된다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LogingController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping(value = "/loging")
public void home() {
System.out.println("LogingController loging");
log.trace("TRACE 로그!!");
log.debug("DEBUG 로그!!");
log.info("INFO 로그!!");
log.warn("WARN 로그!!");
log.error("ERROR 로그!!");
}
}
컨트롤러를 하나만들어 로그가 어떻게 찍히는지 확인해 보자.
실행을 해보면 콘솔창에 로그가 찍히는 것을 확인할 수 있다.
그런데 로그를 다섯 개를 찍었는데 WARN과 ERROR 로그는 찍히지 않았다.
그 이유는 멀까?
로그레벨은 [trace > debug > info > warn > error] 순으로 찍히게 되는데 기본 디폴트 설정이 info 이기 때문에 더 작은 범위인 warn과 error는 찍히지 않은 것이다.
로그설정을 더 명확히 하고 싶다면 resources 폴더아래에 logback-spring.xml 파일을 생성하면 된다.
logback-spring.xml 설정
일단 logback의 구조를 살펴보면,
logback은 로그의 주체인 logger와 어디에 출력할지 기술하는 appender 그리고 어떻게 출력할지를 기술하는 encoder로 나뉜다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%boldMagenta(%d{MM-dd HH:mm:ss}) [%boldYellow(%-5level)] %cyan(%logger{5}.%M) - %msg %n</pattern>
</encoder>
</appender>
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>D:/logs/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>D:/logs/backup/error%d{yyyy-MM-dd}.log.zip</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%boldMagenta(%d{MM-dd HH:mm:ss}) [%boldYellow(%-5level)] %cyan(%logger{5}.%M) - %msg %n</pattern>
<ImmediateFlush>true</ImmediateFlush>
</encoder>
</appender>
<logger name="jdbc" level="OFF" />
<logger name="jdbc.sqlonly" level="OFF" />
<logger name="jdbc.sqltiming" level="OFF" />
<logger name="jdbc.audit" level="OFF" />
<logger name="jdbc.resultset" level="OFF" />
<logger name="jdbc.resultsettable" level="OFF" />
<logger name="jdbc.connection" level="OFF" />
<root level="ERROR">
<appender-ref ref="STDOUT" />
<appender-ref ref="error" />
</root>
</configuration>
logback 설정파일에 STDOUT라는 appender를 하나 만들고 그 안에 encoder도 적어줬다.
encoder안에는 내가 원하는 pattern으로 로그를 출력할 수 있는데 패턴의 요소는 아래와 같다.
pattern에 사용되는 요소
%logger: 패키지 포함 클래스 정보
%logger{0}: 패키지를 제외한 클래스 이름만 출력
%logger{length}: Logger name을 축약할 수 있음. {length}는 최대 자리 수
%-5level: 로그 레벨, -5는 출력의 고정폭 값(5글자), 로깅레벨이i nfo일 경우 빈칸 하나 추가
${PID:-}: 프로세스 아이디
%d: 로그 기록시간 출력
%p: 로깅 레벨 출력
%F: 로깅이 발생한 프로그램 파일명 출력
%M: 로깅일 발생한 메소드의 명 출력
%line: 로깅이 발생한 호출지의 라인
%L: 로깅이 발생한 호출지의 라인
%thread: 현재 Thread 명
%t: 로깅이 발생한 Thread 명
%C: 로깅이 발생한 클래스 명 (%C{2}는 somePackage.SomeClass 가 출력됨)
%m: 로그 메시지
%msg: - 로그 메시지 (=%message)
%n: 줄바꿈(new line)
%%: %를 출력
%r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)
로그 메세지 색상 변경
출력되는 메세지는 %색상명()을 통해 원하는 색깔의 메세지로 보이게 할 수도 있다.
예) %boldMagenta(%d{MM-dd HH:mm:ss})
지원되는 색상은 %black", "%red", "%green", "%yellow", "%blue", "%magenta", "%cyan", "%white", "%gray", "%boldRed", "%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta", "%boldCyan", "%boldWhite" 총 16가지이다.
%highlight로 쓸 경우 로그 레벨에 따라 다른 색상을 출력해 준다.
파일로 저장
로그는 ch.qos.logback.core.rolling.RollingFileAppender 클래스를 통해 파일로 저장할 수도 있다.
<file>에는 저장할 로그의 이름을 적고, <encoder><pattern>을 통해 로그의 패턴을 지정해 주면 된다.
파일 백업이 필요할 경우 <fileNamePattern>에는 백업할 파일명을 <maxHistory>에는 백업할 최대일수를 지정해 준다.
로그를 파일로 출력하거나 2개 이상 분리해서 사용하고 싶다면 아래 블로그글을 참고하기 바란다.