본문 바로가기

개발 지식/Java

[JAVA] Logback 사용법

반응형

Logback을 사용하기에 앞서서, SLF4J를 알아야 한다. Simple Logging Facade for Java의 약자로 Log4J의 개발자가 Logback과 함께 개발한 로깅에 대한 인터페이스 모음이다. 로깅에 대한 추상 레이어를 제공하는 것이고 인퍼테이스 덩어리라고 보면 된다. 이러한 이유로 인해서 artifact 이름도 api가 붙는다.

하지만 이러한 Slf4J를 단독으로 사용한다면 구현체가 없다는 에러가 나온다. 간단하게 slf4j-simple을 추가 할 수도 있지만, 기능이 너무 단순하기 때문에 slf4j native 구현체인 logback을 사용한다.

따라서 다음과 같이 실습을 해보겠다.

 

pom.xml 의존성 추가

<!-- 의존성 추가 -->

<dependencies>
    <!-- logback-core.jar 추가 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>

    <!-- logback-classic.jar 추가 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

    <!-- slf4j-api.jar 추가-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.28</version>
    </dependency>
</dependencies>

 

기본 사용 예시

/** 자바 예시 **/

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

public class Main {
    // LoggerFactory 클래스의 getLogger로 Logger 객체 생성
    private static Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

로그 결과 출력 패턴은 설정 파일을 세팅하지 않고 default로 찍힐 경우, '시간 / 호출 메소드 / 로그 레벨 / 클래스명 / 로그 내용' 순으로 패턴이 출력된다. 기본 설정의 로그 출력 레벨이 debug이기 때문에 trace 레벨의 로그는 출력이 되지 않는다. 다음은 로그 설정 내용

 

설정파일

설정파일 위치

Classpath에 위치시켜야 한다. Classpath를 lib/과 같이 설정하였다면 lib/logback.xml과 같이 위치시키면 된다. 예를 들어 lib/a/ 과 같은 위치에 두면 설정은 적용되지 않는다. 적용할 수 있는 설정파일은 다음과 같다.

  1. logback.groovy
  2. logback-test.xml
  3. logback.xml

위 3개의 파일은 순서대로 높은 우선순위를 가진다. 즉, logback은 Classpath에서 위의 설정파일을 순서대로 검색하여 적용하며, 우선순위가 높은 설정파일을 찾으면 하위 설정 파일은 검색하지 않는다.

※ classpath란? ※

JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일 경로

 

설정파일의 항목

  1. Level : 아래와 같은 순서대로 높은 레벨이며, 출력 레벨의 설정에 따라 설정 레벨 이상의 로그를 출력한다.
    • ERROR
    • WARN
    • INFO
    • DEBUG
    • TRACE
    • ex) 출력레벨을 INFO로 설정하면, DEBUG, TRACE 레벨의 로그는 출력되지 않는다.
  2. Appender : 로그를 출력할 위치, 출력 형식 등을 설정한다. Logback-core 모듈을 통해 사용할 수 있는 Appender는 기본적으로 다음과 같이 3가지가 있다.
    • ConsoleAppender : 로그를 OutputStream에 write하여, 최종적으로 콘솔에 출력되도록 한다.
    • FileAppender : 로그의 내용을 지정된 File에 기록한다.
    • RollingFileAppender
      • FileAppender로부터 상속받은 Appender로서, 날짜, 최대 용량 등을 설정하여 지정한 파일명 패턴에 따라 로그가 다른 파일에 기록되도록 한다. => 대량의 로그를 효과적으로 기록 가능
      • Logback-Core의 기본 Appender 외에도 Logback-Classic 모듈의 다양한 Appender (SSLSocketAppender, SMTPAppender, DBAppender 등)을 사용하여 로그를 원격위치에 기록할 수도 있다.
      • Appender들의 하위 항목으로 출력 형식(Layout Pattern)을 지정하여 각 Appender마다 원하는 내용을 출력시킬 수 있다.
      • ex) %logger(Logger 이름), %thread(현재 스레드명), %level(로그 레벨), %msg(로그메시지), %n(new line) 등
  3. Logger
    • 실제 로그 기능을 수행하는 객체로 각 Logger마다 이름을 부여하여 사용한다.
    • 각 logger마다 원하는 출력 레벨값을 설정할 수 있으며, 0개 이상의 Appender를 지정할 수 있다. 각 소스로부터 입력받은 로깅 메시지는 로그 레벨에 따라 Appender로 전달된다.
    • 기본적으로 최상위 로거인 Root Logger를 설정해 주어야하며, 추가로 필요한 로거에 대해 String 또는 클래스명 형식응로 Logger name을 추가하여 사용할 수 있다. 또한 Logger의 Name은 .문자를 구분자로 사용하여 계층적으로 활용할 수 있다.

 

설정파일 예시

설정파일 기본 구조

<!-- 기본 구조 -->
<configuration>
    <appender> <!--Appender 설정--> </appender>
    <logger> <!--Logger 설정--> </logger>
</configuration>

예시

<!-- 예시 -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <property name="LOGS_ABSOLUTE_PATH" value="./logs" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}][%-5level][%logger{36}] - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_ABSOLUTE_PATH}/logback.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy                  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <logger name="src.Main"  level="debug" additivity="false">
        <appender-ref ref="ROLLING" />
    </logger>

    <logger name="src.Main.Child" additivity="true" />

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

위 예시에서는 2가지의 Appender(Console, Rollingfile), 3가지의 Logger(Root, src.Main, src.Main.Child)를 사용하였다. RollingFileAppender의 경우 먼저 기본 파일명을 경로와 함께 지정하고, 로그 패턴과 Rolling 파일명 패턴을 지정해 주면 된다. 예시에서는 먼저 날짜(yyyy-mm-dd)를 기준으로 파일명을 Rolling하고, timeBasedFileNamingAndTriggeringPolicy 항목을 통해 100MB의 용량 제한을 설정하여 Rolling 하도록 하였다. 여기서 용량제한을 설정할 경우 파일명 패턴에 %i 와 같이 파일명에 변화를 줄 수있는 인자를 추가해 주어야 한다. configuration의 하위 항목으로 scan과 scanPeriod 항목을 추가하여 Auto-Reloading 기능을 활성화 시킬 수도 있다.

 


반응형

'개발 지식 > Java' 카테고리의 다른 글

Thread Pool이란?  (0) 2020.04.04
빌더 패턴(Builder Pattern) 이란  (0) 2020.02.24
[Java] Generic 사용법  (0) 2020.02.10
[JAVA] JDBC란  (1) 2020.02.05
[JAVA] Servlet(서블릿) 이란  (0) 2020.01.27