Logback 설정


Logback은 Java에서 가장 많이 사용되는 logging framework 이다.
Log4j의 후속 버전으로 새롭게 만든 Logging 라이브러리이며, slf4j API를 구현하므로 다른 logging framework와 logback 간에 쉽게 전환이 가능하다.

Log4j1.x와 Logback비교시 Logback 장점

  1. log4j 보다 메모리 점유도 작고, 성능도 10배 이상 향상
  2. log4j는 로그레벨 변경시 서버 재기동이 필요하지만 logback은 내부 스캐닝을 통해 자동으로 로드 가능
  3. 로그 파일 롤링시 설정을 통해서 주기적으로 파일 자동삭제
  4. log4j 보다 많은 필터링 기능 제공

Logback구조

logback은 Logger, Appender, Layout 3가지 구성요소가 있다.

Logger class 는 logback-classic의 모듈 이고, Appender 및 Layout interfaces 는 logback-core 부분 입니다.

  • Logger : 어플리케이션이 로그 메세지를 작성하기 위해 사용하는 클래스
  • Appender : 설정해 놓은 위치에 로그 메세지를 저장
  • Layout: 메세지를 출력할 준비 ( 참고 URL : https://logback.qos.ch/manual/layouts.html )

Log 레벨

설정파일 (순서대로 높은 우선순위를 가짐)

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

Maven Dependency

logback classic에 core가 종속되어있어서 따로 추가 안 해도 된다.

pom.xml
1
2
3
4
5
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>

기본 구성

logback.xml 파일을 만들어 src\main\resources에 추가 한다.


logback.xml
1
2
3
4
5
6
7
8
9
10
11
<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>

테스트를 하기 위해서 main 메서드를 가진 클래스를 생성

Logback.java
1
2
3
4
5
6
7
8
public class Logback {

private static final Logger logger = LoggerFactory.getLogger(Logback.class);

public static void main(String[] args) {
logger.info("log Example {}", Logback.class.getSimpleName());
}
}

1
23:15:16.425 [main] INFO  Logback - log Example Logback

기본 구성을 살펴보면

  1. class="ch.qos.logback.core.ConsoleAppender" 클래스 이름을 참조하는 name="STDOUT" name을 가진 appender가 있다.
  2. 로그 메세지 출력 형식의 <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 을 확인 할수 있다.
  3. root 태그는 debug 모드로 설정하고, STDOUT을 가진 appender 를 참조한다.
  4. Logger 를 만들고 logger.info()메소를 통해 메세지가 출력되는지 결과화면으로 확인한다.

설정 옵션

configuration

설정 파일 수정시 자동으로 로드 ( scanPeriod=”30 seconds“ -> 설정파일 수정을 30초마다 스캔, default=1분 )

1
2
3
<configuration scan="true" scanPriod="30 seconds">
...
<configuration>

Logger

name="me.logback.level"이하 모든 Logger들의 level은 DEBUG라는 설정

1
<logger name="me.logback.level" level="DEBUG"/>

additivity : name="me.logback.level" 이하 패키지는 모두 적용되지만, false 값으로 설정시 name에만 logger 가 적용된다.

1
<logger name="me.logback.level" level="DEBUG" additivity="false"/>

Appender

  • ConsoleAppender
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- "CONSOLE" name 을 가진 appender 설정 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 로그 출력 패턴 지정 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<!-- additivity="false 설정시 me.logback.level 이하 패키지에는 logger 이벤트가 전달되지 않음 -->
<logger name="me.logback.level" level="debug" additivity="false">
<!-- ref="appender name(CONSOLE) 지정" -->
<appender-ref ref="CONSOLE" />
</logger>
  • RollingFileAppender
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>xxx.log</file>
<!-- 날짜 기준에 따라 로그파일 롤링 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 롤링될 로그 파일 패턴 지정 -->
<fileNamePattern>xxx.log.%d{yyyy-MM-dd}</fileNamePattern>
<!-- maxHistory=14이면 14일 이후의 로그파일 삭제 -->
<maxHistory>14</maxHistory>
<!-- 로그파일들의 총 용량 제한 -->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 로그 출력 패턴 지정 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<!-- additivity="false 설정시 me.logback.level 이하 패키지에는 logger 이벤트가 전달되지 않음 -->
<logger name="me.logback.level" level="debug" additivity="false">
<!-- ref="appender name(ROLLING-FILE) 지정" -->
<appender-ref ref="ROLLING-FILE" />
</logger>

파일 생성 결과 화면

logback.xml 샘플

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
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- LOG_FILE, FILE_LOG_PATTERN property 생성 -->
<property name="LOG_FILE" value="C:/logs/logback/logback.log"/>
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 로그 출력 패턴 지정 -->
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- CONSOLE name 을 가진 appender 설정 -->
<appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- property에 설정한 value 값 입력 -->
<file>${LOG_FILE}</file>
<!-- 날짜 기준에 따라 로그파일 롤링 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 롤링될 로그 파일 패턴 지정 -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<!-- maxHistory=14이면 14일 이후의 로그파일 삭제 -->
<maxHistory>14</maxHistory>
<!-- 로그파일들의 총 용량 제한 -->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- property에 설정한 value 으로 로그 출력 패턴 지정 -->
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- root는 최상위 패키지 -->
<!-- additivity="false 설정시 me.logback.level 이하 패키지에는 logger 이벤트가 전달되지 않음 -->
<logger name="me.logback.level" level="debug" additivity="false">
<!-- ref="appender name 지정" -->
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING-FILE" />
</logger>
<root level="error">
<appender-ref ref="ROLLING-FILE" />
</root>
</configuration>

참조