애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것
slf4j 기반으로 구현된 로깅 프레임워크
현재 자바 진영에서 많이 사용된다.
1. 5개의 로그 레벨 설정
ERROR : 로직 수행 시 심각한 문제가 발생해 애플리케이션 작동 불가
WARN : 시스템 에러의 원인이 될 수 있는 경고 레벨
INFO : 애플리케이션 상태 변경과 같은 정보 전달을 위해 사용
DEBUG : 애플리케이션 디버깅을 위한 메시지 표시
TRACE : DEBUG 레벨보다 상세한 메시지 출력
실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그 확인 가능
2. 실제 운영 환경과 개발 환경에서 다른 출력 레벨을 설정해서 로그 확인 가능
3. Logback의 설정 파일을 일정시간마다 스캔해서 애플리케이션을 재가동하지 않고 설정 변경 가능
4. 별도 프로그램 지원 없이 로그파일 압축 가능
5. 저장된 로그 파일에 대한 보관 기간 설정 및 관리 가능
xml 파일을 통해 설정해준다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./logs"/>
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${LOG_PATH}/info.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info_${type}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<!-- TRACE > DEBUG > INFO > WARN > ERROR > OFF -->
<!-- Root Logger -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="INFO_LOG"/>
</root>
</configuration>
로그의 형태를 설정하고 어떤 방법으로 출력할 지 정하는 곳이다.
Appender는 인터페이스이며 하위에 여러 구현체가 있다.
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
Appender가 어떤 레벨로 로그를 기록할 지 지정
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
encoder 요소를 통해 로그의 표현 형식을 패턴으로 정의한다.
%Logger(length)
로거 이름
%-5level
로그 레벨, -5는 출력 고정폭 값
%msg(%message)
로그 메시지
%d
로그 기록 시간
%p
로깅 레벨
%F
로깅 발생한 애플리케이션 파일명
%M
로깅 발생한 메서드 이름
%I
로깅 발생한 호출지 정보
%thread
현재 스레드명
%t
로깅 발생 스레드명
%c
로깅 발생 카테고리
%C
로깅 발생 클래스명
%m
로그 메시지
%n
줄바꿈
%r
애플리케이션 실행 후 로깅 발생 시점까지의 시간
%L
로깅이 발생한 호출 지점의 라인 수
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
다음 패턴은 로그 기록시간과 간격, 현재 스레드명, 로거 이름, 로그메시지, 줄바꿈이 포함되어 있다.
설정 파일에 정의된 Appender를 활용하기 위해 Root 영역에서 Appender를 참조해 로깅 레벨을 설정한다.
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="INFO_LOG"/>
</root>
특정 패키지에 대해 다른 로깅 레벨을 설정하고 싶은 경우 logger를 상용한다.
<logger name="com.springboot.api.controller" level="DEBUG" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="INFO_LOG"/>
</logger>
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController{
private final logger LOGGER = LoggerFactory.getLogger(GetController.class);
@GetMapping(value="/hello")
public String getHello(){
LOGGER.info("getHello 메서드 호출");
return "Hello World";
}
}
메소드 실행 시 인텔리제이 IDEA의 콘솔 화면에 로그가 출력되며 변수에 대해서도 로그를 지정할 수 있다.