2 minute read

라이브러리 추가

프로젝트는 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 로 설정
  • 시간 단위로 파일을 분할 하더라도 하나의 파일의 크기가 너무 커지는 것을 막기 위해서 timeBasedFileNamingAndTriggeringPolicySizeAndTimeBasedFNATP class를 설정하고 maxFileSize에 크기 설정하여 시간과 별개로 파일을 분할
  • maxHistory로 분할된 파일의 최대 개수를 설정

로그 출력 기준

configuration.rootlevel 최소 로그 기준을 설정하고 출력할 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