자바 진영에서 가장 많이 사용되는 로깅 프레임워크는 Logback 입니다. Logback 이란 log4j 이후에 출시된 로깅 프레임워크로서 slf4j를 기반으로 구현됐으며, 과거에 사용되던 log4j에 비해 월등한 성능을 자랑합니다.
또한, 스프링부트의 spring-boot-starter-web 라이브러리 내부에 내장돼 있어 별도의 의존성을 추가하지 않아도 사용할 수 있습니다.
Logback의 특징
Logback의 특징은 다음과 같습니다.
1. 크게 5개의 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR)을 설정할 수 있습니다.
- ERROR: 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우를 의미합니다.
- WARN: 시스템 에러의 원인이 될 수 있는 경고 레벨을 의미합니다.
- INFO: 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용됩니다.
- DEBUG: 애플리케이션의 디버깅을 위한 메시지를 표시하는 레벨을 의미합니다.(주로 개발 단계에서 사용)
- TRACE: DEBUG 레벨보다 더 상세한 메시지를 표현하기 위한 레벨을 의미합니다.
2. 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그를 확인할 수 있습니다.
3. Logback의 설정 파일을 일정 시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정을 변경할 수 있습니다.
4. 별도의 프로그램 지원 없이도 자체적으로 로그 파일을 압축할 수 있습니다.
5. 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리할 수 있습니다.
6. 다양한 로깅 출력 방식을 제공합니다.
- 콘솔: 개발 중 로그를 바로 확인할 수 있도록 터미널에 출력합니다.
- 파일: 로그를 파일로 저장하여 분석이나 모니터링에 활용합니다.
- 데이터베이스: 로그를 데이터베이스에 저장할 수 있습니다.
- 원격 서버: 원격서버로 로그를 전송할 수 있습니다.
7. 로그 파일의 Rolling을 지원합니다.
- Time-based Rolling: 날짜를 기준으로 로그 파일을 분리합니다.
예) 하루 단위로 app-2024-12-24.log, app-2024-12-25.log와 같은 형식으로 저장 - Size-based Rolling: 로그 파일의 크기가 특정 크기(예: 10MB) 초과하면 새로운 로그 파일을 생성합니다.
- Combination Rolling: 날짜와 크기를 조합하여 파일을 관리합니다.
- Compression 지원: 롤링된 로그 파일을 .gz 또는 .zip 형식으로 압축합니다.
8. 특정 조건(예: 로그 메시지에 특정 키워드가 포함되었을 때만 기록)에 따라 로그를 기록할 수 있는 필터링 기능을 제공합니다.
Logback 설정
이제 Logback을 사용하기 위한 설정 파일을 만들어보겠습니다. 일반적으로 클래스패스(classpath)에 있는 설정 파일을 자동으로 참조하므로 Logback 설정 파일은 리소스 폴더 안에 생성합니다. 파일명의 경우 일반적인 자바 또는 스프링 프로젝트에서는 logback.xml 이라는 이름으로 참조하지만 스프링 부트에서는 logback-spring.xml 파일을 참조합니다.
Logback 설정 파일을 가지고 하나하나 살펴보도록 하겠습니다. 우선 크게 Appender 영역과 Root 영역으로 나누어서 살펴보겠습니다.
<!-- logback-spring.xml -->
<configuration>
<appender name="DAILY_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>./application.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./application-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>2</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-mm-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="DAILY_LOG"/>
</root>
</configuration>
Appender 영역
Appender 영역은 로그의 형태를 설정하고 어떤 방법으로 출력할지를 설정하는 곳입니다. Appender 자체는 하나의 인터페이스를 의미항며, 하위에 여러 구현체가 존재합니다. Appender의 상속 구조는 다음과 같습니다.
- ConsoleAppender: 콘솔에 로그를 출력
- FileAppender: 파일에 로그를 저장
- RollingFileAppender: 여러 개의 파일을 순회하면서 로그를 저장
- SMTPAppender: 메일로 로그를 전송
- DBAppender: 데이터베이스에 로그를 저장
Logback 설정 파일의 루트 태그 입니다. 모든 설정은 이 태그 안에 포함됩니다.
<configuration>...</configuration>
Appender의 이름을 설정하고 여러 개의 파일을 순회하면서 로그를 저장하는 Appender 구현체를 정의합니다.
<appender name="DAILY_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
로그의 최소 레벨을 설정하는 필터입니다. 특정 레벨 이상의 로그만 처리하도록 설정합니다. 해당 코드에서는 INFO 이상의 로그(INFO, WARN, ERROR)만 기록합니다.
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
로그를 기록할 파일의 경로를 지정합니다. 애플리케이션 실행 중에는 해당 경로에 로그를 저장합니다.
<file>./application.log</file>
로그를 파일에 추가할지 여부를 결정합니다. true인 경우에는 기존 파일에 로그를 이어 붙입니다. false인 경우에는 기존 파일을 덮어씁니다.
<append>true</append>
날짜마다 로그 파일이 생성될 수 있도록 정책을 설정합니다. maxHistory의 경우 로그 보관 일수를 의미합니다. 해당 일수가 지나면 로그 파일이 삭제됩니다. file 태그에 지정된 application.log는 현재 활성 로그파일이며, 날짜가 지나가면 application-2024-12-25.log 형식으로 파일이 rollover 됩니다.
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./application-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>2</maxHistory>
</rollingPolicy>
encoder 요소를 통해 로그의 표현 형식을 패턴으로 정의합니다.
<encoder>
<pattern>[%d{yyyy-mm-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
패턴 | 의미 |
%d | 로그 기록 시간 |
%p | 로깅 레벨 |
%F | 로깅이 발생한 애플리케이션 파일명 |
%M | 로깅이 발생한 메서드 이름 |
%I | 로깅이 발생한 호출지의 정보 |
%thread | 현재 스레드명 |
%t | 로깅이 발생한 스레드명 |
%c | 로깅이 발생한 카테고리 |
%C | 로깅이 발생한 클래스명 |
%m | 로그 메시지 |
%n | 줄바꿈 |
%r | 애플리케이션 실행 후 로깅이 발생한 시점까지의 시간 |
%L | 로깅이 발생한 호출 지점의 라인 수 |
%logger | 로거의 이름 |
%-5level | 로그 레벨. -5는 출력 고정폭의 값 |
%msg(%message) | 로그 메시지 |
Root 영역
설정 파일에 정의된 Appender를 활용하려면 Root 영역에서 Appender를 참조해서 로깅 레벨을 설정합니다. 만약 특정 패키지에 대해 다른 로깅 레벨을 설정하고 싶다면 root 대신 logger를 사용해 지정할 수 있습니다.
<root level="INFO">
<appender-ref ref="DAILY_LOG"/>
</root>
또는
<logger name="com.springboot.api.controller" level="DEBUG" additivity="false">
<appender-ref ref="DAILY_LOG"/>
</logger>
logger 요소의 name 속성에는 패키지 단위로 로깅이 적용될 범위를 지정하고 level 속성으로 로그 레벨을 지정합니다. additivity 속성은 앞에서 지정한 패키지 범위에 하위 패키지를 포함할지 여부를 결정합니다. 기본값은 true이며, 이 경우 하위 패키지를 모두 포함합니다.
참조
https://ckddn9496.tistory.com/82
Logback - 4. Appenders (2). RollingFileAppender
logback 홈페이지의 매뉴얼을 읽으며 내용들을 정리한 글입니다. RollingFileAppender RollingFileAppender는 FileAppender를 상속하여 로그 파일을 rollover 합니다. 여기서 rollover는 타깃 파일을 바꾸는 것으로 이
ckddn9496.tistory.com
https://goddaehee.tistory.com/45
[LOG] Log4j, LogBack 정리
Log4j 및 LogBack 정리. 1. Log4j(Log for Java) 특징 “Log4j” (현재는 Apache Logging Service라는 Top Project)는 “Ceki Gülcü“라는 개발자가 최초로 만들었다. 1.1 주요 기능 및 특징 ① 속도와 유연성을 고려하여
goddaehee.tistory.com
'Spring' 카테고리의 다른 글
[Spring] 동시에 상품 주문 시 Deadlock found when trying to get lock 에러 (0) | 2025.01.01 |
---|---|
스프링 부트 로그를 Json 형식으로 저장하기 (0) | 2025.01.01 |
[Spring] logback, log4j2 로깅 (2) | 2024.12.24 |
[Spring] 캐시 데이터 동기화 문제 (0) | 2024.11.27 |
[Spring] Spring 캐시를 이용한 로그인 인증 (0) | 2024.11.27 |