CORE
HOME > JAVA > J2SE > CORE
2019.05.29 / 01:05

JAVA에서 LogBack을 이용한 로깅(logging) – 사용법

탁돌이개발자
추천 수 4

사용법을 설명하기앞서 먼저 LogBack과 함께 쓸 SLF4J 에 대해 간략히 설명하겠습니다.
SLF4J란, Simple Logging Facade for Java의 약자로 Log4J의 개발자 Ceki Gülcü가 LogBack과 함께 개발한 Logging Facade 즉, 로깅에 대한 인터페이스 모음이라고 볼 수 있습니다. LogBack이 바로 SLF4J의 Native 구현체이며 SLF4J를 사용하여 로깅 처리를 하면 실제 로그는 LogBack에서 출력하게 됩니다.
SLF4J에 대한 자세한 설명은 아래의 링크에서 확인 할 수 있습니다.
SLF4J 로깅 처리


지금부터 LogBack의 사용방법에 대해 설명하겠습니다.

1. 준비물

우선 필수적으로 총 3개의 모듈이 필요합니다.
logback-core.jar
logback-classic.jar
slf4j-api.jar
세 파일은 아래의 링크에서 다운받을 수 있습니다.
http://logback.qos.ch/download.html
http://www.slf4j.org/download.html

2. 기본 템플릿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package src;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class Main {
 
    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");
    }
}

1) 먼저 org.slf4j 패키지의 Logger, LoggerFactory 클래스를 import 합니다.
2) LoggerFactory 클래스의 getLogger 메소드를 통해 Logger 객체를 생성합니다.
3) Logger 객체의 로그 레벨명의 메소드를 통해 원하는 레벨의 로그를 출력하도록 합니다.

출력 결과 :
%eb%a1%9c%ea%b7%b8-%ec%b6%9c%eb%a0%a5%ea%b2%b0%ea%b3%bc
이는 설정에 아무 적용을 하지 않은 상태에서의 출력결과 입니다. 위와 같이 [ 시간 / 호출 메소드 / 로그 레벨 / 클래스명 / 로그 내용 ] 의 패턴으로 이루어진 로그 메시지가 콘솔에 출력 된 것을 확인할 수 있습니다.
그런데 여기서, 분명히 코드에는 logger.trace("trace");가 있는데 결과에는 TRACE 레벨의 로그가 출력되지 않았습니다. 그 이유는 기본 설정의 로그 출력 레벨이 DEBUG 이기 때문입니다.
위와 같이 Logback과 같은 로깅 라이브러리를 통해 어렵지 않게 로그를 출력시킬 수 있고 로그의 출력레벨, 패턴 등의 설정을 할 수 있는데요. 이어서 설정에 대한 내용을 말씀드리겠습니다.

3. 설정파일 만들기

아무 설정을 적용하지 않은 상태에서의 결과를 위의 [기본 템플릿] 과정에서 확인  할 수 있었습니다. 지금부터는 로그 패턴, 기록위치, 출력레벨 등을 필요에 맞게 설정할 수 있는 설정파일을 작성하는 방법에 대해 알아보겠습니다.

3-1. 설정파일의 위치

가장 먼저 설정파일을 두어야하는 위치는 Classpath 입니다. 만일 Classpath를 lib/ 과 같이 설정하였다면 lib/logback.xml과 같이 위치시키면 됩니다. Classpath의 하위 디렉토리 예를들어 lib/somedir/ 과 같은 위치에 두면 설정은 적용되지 않습니다.

적용할 수 있는 설정파일에는 총 3개가 있습니다.

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

위 세개의 파일은 순서대로 높은 우선순위를 가집니다. 즉, LogBack은 Classpath에서 위의 설정파일을 순서대로 검색하여 적용하며 상위 우선순위의 설정파일을 찾으면 하위 설정파일은 검색하지 않습니다. 만일 3개의 파일이 모두 없다면 기본 설정을 따르게 됩니다.

ex) logback-test.xml 과 logback.xml 파일이 둘 다 있을 경우
>>> logback-test.xml 의 설정을 적용

3-2. 설정파일의 주요 항목

설정파일을 작성하기 앞서 설정할 주요 항목에 대해 알아보겠습니다.

  1. Level
    로그에 설정할 수 있는 레벨은 총 5가지가 있습니다.%ec%ba%a1%ec%b2%98
    1) ERROR
    2) WARN
    3) INFO
    4) DEBUG
    5) TRACE
    위의 순서대로 높은 레벨을 가지며 출력 레벨의 설정에 따라 설정 레벨 이상의 로그를 출력.
    ex) 출력레벨 : INFO  –> DEBUG, TRACE 레벨의 로그는 출력되지 않음.
  2. Appender
    로그를 출력 할 위치, 출력 형식 등을 설정할 수 있습니다.
    Logback-Core 모듈을 통해 사용할 수 있는 기본적 Appender는 3가지가 있습니다.
    1) ConsoleAppender
    – 로그를 OutputStream에 write 하여, 최종적으로 콘솔에 출력되도록 합니다.
    2) FileAppender
    – 로그의 내용을 지정된 File에 기록합니다.
    3) 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마다 Name을 부여하여 사용합니다.
    각 Logger 마다 원하는 출력 레벨값을 설정할 수 있으며, 0개 이상의 Appender를 지정할 수 있습니다. 각 소스로부터 입력받은 로깅 메시지는 로그 레벨에 따라 Appender로 전달 됩니다.기본적으로 최상위 로거인 Root Logger를 설정해 주어야하며, 추가로 필요한 로거에 대해 String 또는 클래스명 형식으로 Logger Name을 추가하여 사용할 수 있습니다. 또한 Logger의 Name은 .문자를 구분자로 사용하여 계층적으로 활용 할 수 있습니다.

    ex)
     아래와 같이 Root 로거 외에 2개의 로거를 추가했다고 가정해보겠습니다.
Logger Name출력 LevelAppenderAdditivity
RootDEBUGConsole 
VehicleINFO RollingFiletrue
Vehicle.CarERROR Filefalse

REPORT THIS AD

여기서 Additivity는 상위 Logger로부터의  상속 여부를 의미합니다. True(기본값)일 경우, 먼저 모든 상위 로거들의 설정값을 상속받아 현재 로거에 설정된 값을 재적용(덮어쓰기) 시키며, False로 설정하게 된다면 해당 로거는 상위 로거의 설정내용을 상속받지 않습니다.

즉, Vehicle의 경우 Root 로거로부터 DEBUG 레벨 설정을 상속받지만 현재 로거에 INFO 레벨이 적용되어 있기 때문에 최종적으로 INFO 레벨이 적용되며, Root 로거의 Console Appender와 Vehicle 로거의 RollingFile Appender 모두에게 로그 메시지를 전달하게 됩니다.

Vehicle.Car의 경우 Additivity 값이 false 이기 때문에 상위 로거인 Root, Vehicle 로거로 부터 설정을 상속받지 않아 최종적으로 ERROR 레벨 이상의 로그가 File Appender로 전달되게 됩니다.

만일 Logger 설정되지 않은 클래스명( ex – Vehicle.Airplane)이 입력되었을 경우, 상위 로거인 Vehicle의 설정내용으로 동일하게 적용됩니다.

3-3. 설정파일 예시

아래의 설정파일(logback.xml)을 통해 기본적인 구조를 살펴보겠습니다.

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
33
34
35
<?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>

설정파일의 기본적인 구조는

1
2
3
4
5
6
7
<configuration>
 
    <appender> Appender 설정 </appender>
 
    <logger> Logger 설정 </logger>
 
</configuration>

으로 되어 있습니다.

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

configuration의 하위 항목으로 scan과 scanPeriod 항목을 추가하여 앞선 개요글에서 설명드렸던 Auto-Reloading 기능을 활성화 시킬 수도 있습니다. 그 외의 설정 내용은 별다른 어려움 없이 이해하실 수 있을 것입니다.

좀더 자세한 설정내용에 대한 내용은 http://logback.qos.ch/manual/configuration.html 에서 확인하실 수 있습니다.

감사합니다!!