[Java]logback 사용 예제
라이브러리 추가
프로젝트는 Gradle 언어는 Java를 사용하였다
./build.gradle
// (중략)
dependencies {
// https://mvnrepository.com/artifact/org.slf4j/slf4j-api
implementation 'org.slf4j:slf4j-api:2.0.0-alpha7'
// https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
implementation 'ch.qos.logback:logback-classic:1.3.0-alpha16'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
// (중략)
추가할 라이브러리는 slf4j
, logback-classic
두가지를 추가한다
로그 설정
./src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<property name="LOGS_ABSOLUTE_PATH" value="./log" />
<property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS, GMT+9}][%thread][%-5level][%marker]\\(%F:%L\\): %m%n" />
<!-- 콘솔 출력 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern> <!-- 로그 출력 패턴 -->
</encoder>
</appender>
<!-- 파일 출력 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- RollingFileAppender 사용 -->
<file>${LOGS_ABSOLUTE_PATH}/application.log</file> <!-- 파일 경로 및 파일 이름 -->
<encoder>
<pattern>${LOG_PATTERN}</pattern> <!-- 로그 출력 패턴 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 시간으로 파일 분할 정책 -->
<fileNamePattern>${LOGS_ABSOLUTE_PATH}/application.%d{yyyy-MM-dd_HH-mm-ss}.%i.log.gz</fileNamePattern> <!-- 분할 파일 이름 패턴 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500KB</maxFileSize> <!-- 분할 파일 크기 기준 -->
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory> <!-- 분할된 파일의 최대 개수 -->
</rollingPolicy>
</appender>
<root level="DEBUG"> <!-- 로그 출력 기준 -->
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
로그의 출력 패턴과 로그 출력 종류 그리고 파일로 저장하고 특정 기준에 맞추어서 파일 분할에 대한 설정 파일이다
로그 출력 패턴
configuration.appender.encoder.pattern
에 설정하는데 위 설정 파일에서는 configuration.property
에 설정
콘솔 출력과 파일 출력에 동시에 사용 하도록 설정하였다.
콘솔 출력
configuration.appender
에 이름을 CONSOLE로 설정하고 class는 ConsoleAppender를 사용한다
파일 출력
configuration.appender
에 이름을 FILE로 설정하고 class는 RollingFileAppender 사용한다
file
은 파일의 경로와 파일 이름rollingPolicy
에 파일 분할 정책을 설정하는데TimeBasedRollingPolicy
class를 설정fileNamePattern
로 분할 된 파일의 경로와 이름을 설정하는데 파일 이름에 분할 시간을 설정하는데
위 설정에는yyyy-MM-dd_HH-mm-ss
와 같이 초 단위까지 설정 하면 초 단위로 파일이 분할
일 단위로 분할 하고 싶은 경우에는yyyy-MM-dd
로 설정- 시간 단위로 파일을 분할 하더라도 하나의 파일의 크기가 너무 커지는 것을 막기 위해서
timeBasedFileNamingAndTriggeringPolicy
에SizeAndTimeBasedFNATP
class를 설정하고maxFileSize
에 크기 설정하여 시간과 별개로 파일을 분할 maxHistory
로 분할된 파일의 최대 개수를 설정
로그 출력 기준
configuration.root
에 level
최소 로그 기준을 설정하고 출력할 appender
를 추가
예제 코드
./src/main/java/AppMain.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
public class AppMain {
private static final Marker FATAL_MARKER = MarkerFactory.getMarker("FATAL");
private static final Logger logger = LoggerFactory.getLogger(AppMain.class);
public static void main(String[] args) throws Exception {
for (int index = 0; index < 10000; index++) {
logger.debug(FATAL_MARKER, "RollingFileAppender TEST: {}", index);
Thread.sleep(1L);
}
}
}
콘솔 출력
[2022-07-31 00:30:08.136][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 0
[2022-07-31 00:30:08.140][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 1
[2022-07-31 00:30:08.142][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 2
[2022-07-31 00:30:08.144][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 3
[2022-07-31 00:30:08.145][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 4
[2022-07-31 00:30:08.147][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 5
[2022-07-31 00:30:08.149][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 6
(중략)
[2022-07-31 00:30:25.746][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 9996
[2022-07-31 00:30:25.747][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 9997
[2022-07-31 00:30:25.749][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 9998
[2022-07-31 00:30:25.751][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 9999
파일 출력
+---log
| application.2022-07-31_00-30-15.0.log.gz
| application.2022-07-31_00-30-16.0.log.gz
| application.2022-07-31_00-30-17.0.log.gz
| application.2022-07-31_00-30-18.0.log.gz
| application.2022-07-31_00-30-19.0.log.gz
| application.2022-07-31_00-30-20.0.log.gz
| application.2022-07-31_00-30-21.0.log.gz
| application.2022-07-31_00-30-22.0.log.gz
| application.2022-07-31_00-30-23.0.log.gz
| application.2022-07-31_00-30-24.0.log.gz
| application.log
파일을 초 단위로 분할, 최대 10개의 파일
Leave a comment