Post

Logback 간단 사용 예제

java 어플리케이션에서 로그를 위한 프레임워크는 logback, log4j 등이 존재 한다 로그 프레임워크를 유연하게 사용할 수 있게 하는 인터페이스인 slf4j가 있다

java 어플리케이션에서 로그를 위한 프레임워크는 logback, log4j 등이 존재 한다

로그 프레임워크를 유연하게 사용할 수 있게 하는 인터페이스인 slf4j가 있다

로그 프레임워크를 사용하기 위해서는 slf4j와 다양한 로그 프레임워크중 하나를 선택하여 java 어플리케이션에 적용 한다

예제에 사용된 소스 코드는 하단의 Repository 링크를 참고하면 된다

Java Application

dependency

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
plugins {
    id 'java'
}

group = 'com.illdangag'
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/org.slf4j/slf4j-api
    implementation 'org.slf4j:slf4j-api:2.0.13'
    // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
    implementation 'ch.qos.logback:logback-classic:1.5.6'

    testImplementation platform('org.junit:junit-bom:5.10.0')
    testImplementation 'org.junit.jupiter:junit-jupiter'
}

test {
    useJUnitPlatform()
}

build.gradle 에 slf4j와 logback에 대한 의존성을 추가한다

resources

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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_0" 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_0}</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_0}</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>

logback을 사용하므로 logback.xml 파일을 resources 경로에 생성하여 log 설정을 한다

하나의 log 형식으로 console과 file로 출력하기 위해서 LOG_PATTERN_0 property로 선언하여 사용한다

console 출력을 하기 위해서 ch.qos.logback.core.ConsoleAppender 을 등록한다

file 출력을 하기 위해서 ch.qos.logback.core.rolling.RollingFileAppender 을 등록한다

RollingFileAppender

  • file

    파일 경로 및 파일 이름

  • file.encoder.pattern

    로그 출력 패턴

  • rollingPolicy.fileNamePattern

    조건에 의해서 분할된 파일의 이름

    파일 이름에 시간 패턴이 들어가는 경우 시간을 표현한 단위 수준에서 시간에 따라 파일 분할

  • rollingPolicy.timeBasedFileNamingAndTriggeringPolicyclass 요소

    파일이름이 시간 패턴에 따른 파일 분할의 구현체

  • rollingPolicy.timeBasedFileNamingAndTriggeringPolicy.maxFileSize

    분할 파일의 최대 크기

  • rollingPolicy.maxHistory

    분할 파일의 최대 개수

    분할 파일의 개수가 설정 값보다 커지는 경우 가장 먼저 생성된 파일이 삭제되고 새로운 분할 파일이 생성

Java application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.illdangag;

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 < 1000; index++) {
            logger.debug(FATAL_MARKER, "RollingFileAppender TEST: {}", index);
            Thread.sleep(1L);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
[2024-05-15 14:00:37.288][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 0
[2024-05-15 14:00:37.294][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 1
[2024-05-15 14:00:37.295][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 2
[2024-05-15 14:00:37.297][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 3
...
...
...
[2024-05-15 14:00:38.678][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 996
[2024-05-15 14:00:38.679][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 997
[2024-05-15 14:00:38.681][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 998
[2024-05-15 14:00:38.682][main][DEBUG][FATAL](AppMain.java:14): RollingFileAppender TEST: 999
1
2
3
4
5
6
7
8
9
├── application.2024-05-15_14-00-29.0.log.gz
├── application.2024-05-15_14-00-30.0.log.gz
├── application.2024-05-15_14-00-31.0.log.gz
├── application.2024-05-15_14-00-32.0.log.gz
├── application.2024-05-15_14-00-33.0.log.gz
├── application.2024-05-15_14-00-34.0.log.gz
├── application.2024-05-15_14-00-35.0.log.gz
├── application.2024-05-15_14-00-37.0.log.gz
└── application.log

logback.xml 파일의 설정에 맞게 로그 형식에 맞게 출력되고 파일 분할이 되는 것을 확인 할 수 있다

This post is licensed under CC BY 4.0 by the author.