Logback이란?
Log4J를 기반으로 개발된 로깅 라이브러리
log4j에 비해 약 10배 정도 빠른 퍼포먼스, 메모리 효율성 증대
Slf4j의 구현체로 Spring Boot 환경이라면 별도의 dependency 추가 없이 기본적으로 포함되어 있다.
로그 레벨
Trace → Debug → Info → Warn → Error 순으로 심각한 로그임을 의미한다
Trace
- 모든 레벨에 대한 로깅이 추적 (개발단계에서 사용)
Debug
- 개발 단계에서 사용하며 SQL 로깅을 할 수 있다.
Info
- 운영에 참고할만한 사항
Warn
- 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리
Error
- 예상하지 못한 심각한 문제가 발생하는 경우
Logback설정
Logback은 일반적으로 ClassPath에 있는 logback 설정 파일을 참조하게 된다.
Spring의 경우에는 logback.xml을 참고하고 Spring boot의 경우에는 logback-spring.xml을 참조하게 된다.
Logback 설정파일 형식
Logback의 파일에 대해 간략하게 설명하자면 다음과 같이 되어있다.
<configuration>: Logback 설정의 최상위 요소
<property/>: 재사용 가능한 설정 값을 정의
<appender>: 로그를 출력할 방법을 정의
<encoder>: 로그 메시지의 포맷을 설정
<root>: 루트 로거를 정의하며, 로그 레벨과 사용될 appender를 설정
<configuration>
<property/>
<appender>
<encoder>
<pattern/>
</encoder>
</appender>
<root>
<appender-ref/>
</root>
</configuration>
<appender>
로그의 형태 및 어디에 출력할지 설정하기 위한 영역을 설정하며 크게 5가지가 있다.
ConsoleAppender
- 콘솔에 로그 출력를 출력한다.
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 기타 설정 -->
</appender>
FileAppender
- 로그를 특정 파일에 저장한다. 파일 이름과 경로를 설정할 수 있다.
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>logs/app.log</file>
<!-- 기타 설정 -->
</appender>
RollingFileAppender
- 여러 개의 파일을 순회하며 로그를 저장한다.
- <file></file>에 저장될 경로와 파일 이름을 지정한다.
- <rollingPolicy>에 특정 조건에 도달하면 새로운 파일을 생성하는 순환 정책을 정의한다.
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy>
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 30일치 로그를 보관 -->
</rollingPolicy>
</appender>
SMTPAppender
- 로그를 메일로 보낸다.
<appender name="smtp" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.example.com</smtpHost>
<!-- 기타 설정 -->
</appender>
- DBAppender: 데이터베이스에 로그를 저장한다
<appender name="dbAppender" class="ch.qos.logback.classic.db.DBAppender">
<!-- 데이터베이스 설정 -->
</appender>
<filter>
로깅 시스템에서 특정 조건을 기반으로 로그 메시지를 걸러내기 위해 사용하는 요소
즉, 로그 메시지를 출력할지 말지를 결정하는 역할을 한다.
ThresholdFilter
- 로그 레벨을 기준으로 필터링한다. 예를 들어, WARN이상의 레벨의 로그만 기록한다.
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
EvaluatorFilter
- 로그 메시지의 내용이나 다른 속성을 기준으로 필터링할 수 있다.
- expression: 로그 메시지에 Error라는 단어가 포함된 메시지만 기록하는 예시
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>e.getMessage().contains("Error")</expression>
</evaluator>
</filter>
<encoder>
- 로그의 출력 형식을 정의하는 데 사용된다.
- 로그가 출력될 때, 그 형식과 구조를 결정한다.
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{30} %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<root>
설정한 appender 를 참조해서 로그의 레벨을 설정할 수 있다.
root는 전역 설정이며, 지역설정을 하기 위해서는 <logger>를 사용한다
- appender name에 설정한 console을 참조하여 로그를 출력한다.
- <appender-ref> 에 appender와 동일한 이름을 넣어주어야 한다.
<root level="INFO"> <!-- 루트 로그는 INFO 이상을 출력 -->
<appender-ref ref="console" />
</root>
Logback으로 Console에 간단한 로그 출력
resources 디렉토리 아래에 logback 설정 파일을 생성해 주어야 한다.
이 글에서는 Spring boot이므로 logback-spring.xml 으로 생성해 주었다.
logback-spring.xml
Info 레벨 이상의 로그를 콘솔에 출력하는 간단한 설정
<configuration scan="true" scanPeriod="30 seconds">
<!-- 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>
<root level="**Info**">
<appender-ref ref="console" />
</root>
</configuration>
Hellocontroller
Hellocontroller 클래스의 로깅을 위한 Logger 객체를 생성한다.
로그를 기록출력하기 위해서는 LoggerFactory를 사용하여 Logger 객체를 생성해야 한다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Hellocontroller {
private final Logger LOGGER = LoggerFactory.getLogger(Hellocontroller.class);
// @RequestMapping(value = "/hello", method = RequestMethod.GET)
@GetMapping
public String getHello() {
return "Hello World";
}
@PostMapping("log-test")
public void logTest() {
LOGGER.trace("trace log");
LOGGER.debug("debug log");
LOGGER.info("info log");
LOGGER.warn("warn log");
LOGGER.error("error log");
}
로그 객체를 생성한 뒤 스웨거를 통해 요청을 보내면 INFO이상의 로그만 출력되는것을 확인할 수있다.
참고
로깅 프레임워크 Logback 적용하기 [ 스프링 부트 (Spring Boot) ] (youtube.com)
'Spring' 카테고리의 다른 글
Spring boot의 예외처리 (1) | 2024.09.13 |
---|---|
유효성 검증(Validation) (0) | 2024.09.08 |
Spring Boot에서 JPA 사용하기 (0) | 2024.09.06 |
JPA란? (3) | 2024.09.01 |
의존성 주입 방법 (0) | 2024.08.25 |