본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/spring

[spring] logback 사용하기(slf4j 선언)

by 미노드 2023. 6. 1.

logging 도구로써 최근에 자주 쓰이는 logback 을 사용하는 방법을 정리해보려 합니다.
log4j에서 개선할 부분을 개선하여 만들어진 도구이며, 사용방법도 비슷합니다.

spring boot에선 lombok으로 @Slf4j 선언해서 사용해도 됩니다.
그러나 처음 사용하는 입장에서 logger 객체를 선언해 사용하는 연습을 해보려 하기에
lombok을 이용하지 않고 직접 선언해서 사용하는 방식을 예시로 정리해봤습니다.

logback의 특징을 간단히 정리해보면 다음과 같습니다.

- 로깅과 동시에 파일로 로그 저장이 편리하다.
- 로그레벨 관리를 appender 기준으로 할 수 있다.
- 기존 log4j보다 성능, 로깅시간이 빠르다.

1. logger 선언

import org.slf4j.Logger;

private final Logger log = LoggerFactory.getLogger(getClass());

logback을 직접 선언하지 않고 slf4j (추상화 역할을 하는 라이브러리)를 통해서 사용합니다.
slf4j를 사용하면 logback이 동작하도록 설정해놓고 slf4j으로 동작하는 것입니다. <퍼사드 패턴 참고>
logback말고 log4j도 slf4j를 선언하여 사용할 수 있으며, 이는 설정파일에서 설정 가능합니다. 

https://teck10.tistory.com/327

 

[spring] logging 방법 slf4j 이 무엇인가? 정리해보자.

자바로 개발하다보면 log4j를 사용해 개발하는 경우가 대부분이었는데, 스프링 부트를 접하면서 slf4j로 갈아타는 추세인 것 같다. Simple Logging Facade for Java (SLF4J) 를 줄여서 SLF4J 라고 부르는데, facad

onpups.pe.kr

2. 설정파일 추가

logback.xml  (파일명은 변경해서 사용가능함, logback-product.xml 처럼)
- application.properties  (profile 로 product, dev 구분 가능함)

logback 설정을 위해 resource 폴더에 logback.xml 파일을 작성해줍니다.
자동으로 생성되지 않으며, 직접 만들어야합니다.

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
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{HH:mm:ss} %-5level %logger{36} - %msg%n</Pattern>
        </encoder>
    </appender>
 
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/tmp/access.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/tmp/access-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>33</maxHistory>
        </rollingPolicy>
 
        <encoder>
            <Pattern>%d{HH:mm:ss} [%-5level] %logger{36}[line: %L] - %msg%n</Pattern>
        </encoder>
    </appender>
 
    <logger name="com.demo.api" level="debug"/>
    <logger name="org.springframework" level="info"/>
 
    <root level="debug">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>
cs

이 설정 파일의 루트 요소는 configuration이며, 해당 루트 요소 안에는 appender, logger, root 등에 대한 설정을 하게 됩니다.

<Appender>
Appender는 어디에 어떤 포맷으로 로그를 남길 것인지 정할 수 있는 방법을 제공합니다.
대표적으로 ConsoleAppender, FileAppender, RollingFileAppender 등이 있습니다.(이름대로 작동)
ConsoleAppender는 콘솔에 로그를 어떤 포맷으로 출력할지 설정할 때 사용하는 것이고,
FileAppender는 파일에 로그를 어떤 포맷으로 출력할지 설정할 때 사용합니다..
RollingFileAppender는 로그 양이 많아지면 하나의 파일로 관리하기가 어려워지는데, 이를 방지하기 위해 주기를 설정해 로그 파일을 백업하면서 로그를 남기고자 할 때 사용할 수 있습니다.

<ConsoleAppender>

1
2
3
4
5
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <Pattern>%d{HH:mm:ss} %-5level %logger{36} - %msg%n</Pattern>
  </encoder>
</appender>
cs

appender 요소 안에 name 속성 값은 보통 CONSOLE이라 정하고, class는 ConsoleAppender를 지정합니다.
encoder 안의 Pattern이란 요소엔 로그를 출력할 형태의 포맷을 지정합니다.
%d{HH:mm:ss}은 로그가 출력되는 시간이 출력된다. 중괄호{ } 안은 이 시간의 포맷입니다.
%-5level은 로그 레벨을 5의 고정폭 값으로 출력하라는 것을 의미합니다.
%logger는 logger의 이름을 축약해서 출력한다. 중괄호{ } 안에는 length이다. 최대 자릿수를 의미합니다.
%msg는 %message의 alias로, 사용자가 출력한 메시지가 출력됩니다.
%n은 줄바꿈.

<RollingFileAppender>

1
2
3
4
5
6
7
8
9
10
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/tmp/access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/tmp/access-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>33</maxHistory>
    </rollingPolicy>
    <encoder>
        <Pattern>%d{HH:mm:ss} [%-5level] %logger{36}[line: %L] - %msg%n</Pattern>
    </encoder>
</appender>
cs

appender의 name은 FILE, class는 RollingFileAppender로 설정합니다.
기본적으로 기록되는 파일명은 file 요소에 입력되어 있는 access.log입니다.
root 경로 기준 절대경로로 작성하면 되며, 이클립스에서 실행한다면 이클립스 설치 경로에 로그 파일이 생성됩니다.
rollingPolicy 엘리먼트 안엔 파일이 언제 백업될지 결정짓는 내용들이 있습니다.
위 소스의 내용에 따르면, access-로 시작하면서 년, 월, 일에 대한 정보를 가지는 로그 파일(fileNamePattern 요소 안의 내용)이 최대 33개(maxHistory 요소의 내용) 생성 되는 것입니다.
최대 33개가 다 차면, 이전 로그 파일을 삭제하고 생성합니다.
encoder 안에 있는 Pattern 요소 안에는 로그를 출력할 형태를 지정할 수 있습니다.

<Log Level>

1
2
<logger name="com.artiplace.api" level="debug"/>
<logger name="org.springframework" level="info"/>
cs

Log Level (아래쪽으로 갈수록 심각한 오류를 의미)

  1. trace
  2. debug
  3. info
  4. warn
  5. error

프로젝트를 할 때, 어떤 오류를 어떤 방식으로 남길지 약속하기도 합니다.
개발할 땐 조금 더 자세한 로그를 보고 싶을 수도 있고, 실제 운영 중일 땐 그 정도까지 필요는 없을 수 있기 때문이며
각 레벨들을 필요에 따라 조정해서, 로그레벨에 따라 어느정도까지 출력할지 구분합니다.

logback 설정에서 logger라는 엘리먼트는 어떤 패키지 이하의 클래스에서 어떤 레벨 이상의 로그를 출력할지 결정할 때 사용합니다.
level="debug" 라면 debug info warn error 가 출력됩니다.
level="info" 라면 info warn error 만 출력됩니다.
level="error" 라면 error 만 출력됩니다.

이런식으로 패키지 기준으로 로그 제한 레벨을 설정할 수 있습니다.

<root>

root 태그에 설정을 한다면, 모든 대상에 CONSOLE, FILE Appender를 적용하라는 의미입니다.
이렇게 하면 콘솔과 파일로 두 번 로그를 출력하게 됩니다.

1
2
3
4
<root level="debug">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
</root>
cs