웹프로그래밍 무작정따라하기/JAVA_Spring

[Spring Boot] 프로젝트에 System.out대신 로깅 프레임워크 Logback적용하기

RIMD 2023. 9. 11. 15:47

Logback 설정

Logback은 Java 어플리케이션에서 로깅을 구현하기 위한 인기 있는 라이브러리 중 하나입니다.

 Logback을 설정하는 방법은 다음과 같습니다.

일반적으로 Classpath에 있는 logback설정 파일을 참조하게 됨
- Java Legacy, Spring의 경우에는 logback.xml 파일을 참조
- Spring Boot의 경우에는 logback-spring.xml 파일을 참조

 

1. Logback 라이브러리 추가
프로젝트의 빌드 도구에 따라 Maven, Gradle 등을 사용하여 Logback 라이브러리를 프로젝트에 추가해야 합니다. 
Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다.

<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.6</version> <!-- 최신 버전 확인 필요 -->
    </dependency>
</dependencies>

 

2. Logback 설정 파일 생성
Logback은 XML 또는 Groovy 구성 파일을 사용하여 로깅을 구성할 수 있습니다.
 일반적으로 XML 구성 파일을 사용합니다. 프로젝트 루트 디렉토리에 logback.xml 파일을 생성하거나 원하는 위치에 생성합니다.

예를 들어, logback.xml 파일은 다음과 같이 보일 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

이 설정 파일은 콘솔에 로그를 출력하는 간단한 설정입니다. 더 복잡한 설정은 Logback 문서를 참조하여 구성할 수 있습니다.

3. 로깅 사용

이제 Logback을 사용하여 로깅을 추가할 수 있습니다. Java 클래스에서 Logback 라이브러리를 import하고, 로그를 기록하려는 위치에서 Logger 객체를 생성하여 사용합니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
    private static final Logger logger = LoggerFactory.getLogger(MyApp.class);

    public static void main(String[] args) {
        logger.debug("This is a debug message.");
        logger.info("This is an info message.");
        logger.error("This is an error message.");
    }
}

위 코드는 Logback의 Logger를 사용하여 로그를 기록합니다. 설정 파일에서 설정한 로그 레벨에 따라 다른 로그 메시지가 출력됩니다.

4. 로그 출력
프로그램을 실행하면 설정한 로그 메시지가 콘솔에 출력됩니다. 설정 파일에서 로그 출력 대상을 변경하고 싶다면 다른 Appender 및 Logger 설정을 추가하실 수 있습니다.

이러한 단계를 따라 Logback을 설정하고 Java 어플리케이션에서 로깅을 시작할 수 있습니다. 더 많은 구성 옵션 및 설정에 대한 자세한 내용은 Logback 공식 문서를 참조하십시오.

 

Documentation

Logback documentation Below is a list of logback-related documentation currently available. Source code related documentation: Articles and Presentations In french

logback.qos.ch

 

Logback 설정 구조

 

appener

Log의 형태 및 어디에 출력할지 설정하기 위한 영역

 

대표적인 Appender 형식은 아래와 같습니다.

아래 굵은 글씨로 표기 해둔 appender들이 주로 많이 사용됩니다.

- ConsoleAppender: 콘솔에 로그를 출력

- FileAppender: 파일에 로그를 저장

- RollingFileAppenbder: 여러 개의 파일을 순회하며 로그를 저장(log의 레벨 기준으로 출)

- SMTPAppender: 로그를 메일로 보냄

- DBAppender: 데이터베이스에 로그를 저장

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 로그 파일 이름과 위치 지정 -->
        <file>/path/to/your/logfile.log</file>
        
        <!-- 파일의 최대 크기와 롤링 정책 지정 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 파일 위치 및 파일 형식 지정 -->
            <fileNamePattern>/path/to/your/logfile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize> <!-- 파일의 최대 크기 -->
            <maxHistory>7</maxHistory> <!-- 롤링 파일을 유지할 일수 -->
            <totalSizeCap>1GB</totalSizeCap> <!-- 전체 로그 파일 크기 제한 -->
        </rollingPolicy>

        <!-- Appender내에 포함되는 항목이며, pattern을 사용하여 원하는 형식으로 로그를 표현할 수 있음 -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        
        <!-- INFO 레벨까지만 로깅 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 
    	설정한 Appender를 참조하여 로그의 레벨을 설정할 수 있음
    	root는 전역 설정이며, 지역 설정을 하기 위해서는 logger를 사용
    -->
    <root level="DEBUG">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

 

로그 레벨

Logback에서 사용 가능한 로그 레벨은 다음과 같습니다. 로그 레벨은 로깅 메시지의 중요도에 따라 설정되며, 
낮은 레벨은 높은 레벨보다 더 중요한 메시지를 나타냅니다.

TRACE > DEBUG > INFO > WARN > ERROR

 

TRACE: 가장 낮은 로그 레벨. 매우 상세한 디버그 정보를 포함합니다.
DEBUG: 디버깅 정보를 나타내며, TRACE보다 상위 레벨입니다.
INFO: 일반적인 정보 메시지입니다.
WARN: 경고 메시지. 잠재적인 문제를 나타냅니다.
ERROR: 오류 메시지. 심각한 문제 또는 예외 상황을 나타냅니다.

이러한 로그 레벨 중에서 설정하고자 하는 로그 레벨을 선택하여 Logback 설정 파일에서 사용할 수 있습니다.
예를 들어, INFO 레벨까지만 로깅하려면 <root> 요소의 level 속성을 "INFO"로 설정하시면 됩니다.

위의 코드 참고바랍니다.

* 예를 들어, 로그 레벨을 'INFO'라고 설정했을 경우, 'TRACE', 'DEBUG'레벨은 출력되지 않음.

 

Logback 로깅 패턴

1. %d: 로그 이벤트의 날짜 및 시간을 출력합니다.
    예: %d{HH:mm:ss.SSS}는 "15:30:45.123"와 같은 형식으로 출력합니다.
2.%thread: 로그 이벤트를 발생시킨 스레드의 이름을 출력합니다.
3. %level: 로그 이벤트의 레벨 (TRACE, DEBUG, INFO, WARN, ERROR)을 출력합니다.
4. %logger: 로그 이벤트를 발생시킨 로거 이름을 출력합니다.
   %logger{36}는 로거 이름을 최대 36자로 자르도록 설정합니다.
5. %msg: 로그 이벤트의 메시지를 출력합니다.
6. %n: 줄 바꿈 문자를 출력합니다.
7. %t: 로그 이벤트를 발생시킨 스레드의 ID를 출력합니다.
8. %class: 로그 이벤트를 발생시킨 클래스의 이름을 출력합니다.
9. %method: 로그 이벤트를 발생시킨 메서드의 이름을 출력합니다.
10. %M: 로그 이벤트를 발생시킨 메서드의 정보를 출력합니다.
11. %L: 로그 이벤트를 발생시킨 로깅 호출의 소스 코드 라인 번호를 출력합니다.
12. %ex: 예외 정보를 출력합니다.
13. %X: MDC (Mapped Diagnostic Context)에서 키와 연결된 값을 출력합니다.
14. %-5level: 로그 레벨을 출력하고 최소 5자리로 표시하며 왼쪽 정렬합니다.
15. %-10(%logger{10}):: 최대 10자로 제한된 로거 이름을 출력하고 왼쪽 정렬합니다.
16. %highlight(%msg){yellow}: 메시지를 노란색으로 강조 표시합니다.
17. %date{ISO8601}: ISO 8601 형식의 날짜 및 시간을 출력합니다.

 

이러한 패턴을 조합하여 로그 출력 형식을 원하는 대로 지정할 수 있습니다. Logback 구성 파일의 <encoder>섹션 내에서 패턴을 사용하여 로그 메시지 형식을 정의합니다.

 

<encoder>
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>

 

위 설정은 로그 이벤트의 날짜 및 시간, 스레드 이름, 로그 레벨, 로거 이름 및 메시지를 출력하는 패턴입니다. 패턴을 원하는대로 사용자 정의하여 로그 메시지 출력 형식을 조정할 수 있습니다.

 

Logback에서 변수 사용 설정

Logback에서 변수를 사용하여 설정을 관리할 수 있습니다. 변수를 사용하면 설정 파일에서 중복된 값이나 설정을 효율적으로 관리할 수 있습니다. Logback에서 변수를 정의하고 사용하는 방법은 다음과 같습니다.

 

1. property 요소를 사용하여 변수 정의
logback.xml 파일 내에서 <property> 요소를 사용하여 변수를 정의할 수 있습니다. 
예를 들어, 다음과 같이 logDirectory라는 변수를 정의할 수 있습니다.

<configuration>
    <property name="logDirectory">/path/to/logs</property>
    
    <!-- 나머지 설정 -->
</configuration>

 

2. 정의한 변수를 사용
변수를 사용하려면 설정 파일의 다른 위치에서 ${변수이름} 형식으로 변수를 참조합니다. 
변수를 사용하여 파일 경로, 패턴 등을 지정할 수 있습니다.

예를 들어, RollingFileAppender의 파일 경로를 변수를 사용하여 설정할 수 있습니다.

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 로그 파일 이름과 위치를 변수로 지정 -->
    <file>${logDirectory}/app.log</file>
    
    <!-- 나머지 설정 -->
</appender>

 

3. 변수의 값을 동적으로 변경

Logback는 설정 파일에서 변수 값을 동적으로 변경하는 기능을 제공합니다. 
예를 들어, 시스템 프로퍼티, 환경 변수 또는 Java 속성을 사용하여 변수 값을 설정할 수 있습니다. 
이렇게 하면 실행 중에 변수 값을 변경할 수 있어 유용합니다.

예를 들어, 시스템 프로퍼티를 사용하여 변수 값을 변경하는 방법은 다음과 같습니다.

// 시스템 프로퍼티 설정
System.setProperty("logDirectory", "/new/log/directory");

 

이렇게 하면 Logback 설정 파일에서 정의한 ${logDirectory} 변수의 값이 변경됩니다.
변수를 사용하여 Logback 설정을 관리하면 설정을 더 유연하게 관리하고 유지보수하기 쉽게 만들 수 있습니다.