개발 공부 기록

[Spring] Logback을 사용하여 에러 로깅하기 본문

Spring/Development Log

[Spring] Logback을 사용하여 에러 로깅하기

나만없서고냥이 2023. 12. 4. 18:54

✔️ Logback 이란?

로깅을 위한 추상화된 인터페이스를 제공하는 Slf4j의 구현체에는 대표적으로 Log4j와 Logback이 있습니다. Logback은 Log4j보다 더 빠르고 효율적인 로깅 솔루션을 제공하는 Java 기반의 로깅 프레임워크입니다. XML 기반의 설정 파일을 사용하며, 설정 파일을 통해 로그 레벨, 출력 형식, 출력 대상 등을 구성할 수 있습니다. Logback은 로그를 출력하는 필터, 스레드 컨텍스트 기반의 로깅, 조건부 로깅과 같은 고급 기능을 내장하고 있으며, SpringBoot에서는 기본적으로 Logback을 지원하기 때문에 별도의 설정없이 사용할 수 있습니다.

 

Logback의 주요 구성 요소는 아래와 같습니다.

Logger : 로그를 기록하는 주요 인터페이스로, 로그 레벨을 설정하여 어떤 종류의 로그를 기록할 지 결정할 수 있습니다.

Appenders : 로그 이벤트를 출력 대상으로 보내는데 사용됩니다. 파일, 큰솔, 데이터베이스 등에 로그를 출력할 수 있습니다.

Layouts : 로그 메시지의 형식, 타임스탬프의 형태 등 로그 이벤트의 출력 형식을 정의합니다.

 

📝 로그 레벨은 기본적으로 [trace > debug > info > warn > error] 순이며 디폴트로 info 레벨까지 큰솔에 출력되도록 설정되어 있습니다. 저는 debug 레벨 수준까지의 로그를 확인하고 싶기에 이에 대한 작업을 진행해보겠습니다.

 


✔️ logback-spring.xml을 통해 큰솔에 로그 출력하기

//application.yml
logging:
  level:
    root: debug

위와 같이 applicaion.yml(혹은 application.properties)를 통해 큰솔 로그 레벨을 간단히 변경해줄 수 있으나, logback-spring.xml을 통해 Appender, Layout, Filter 등 Logback의 다양한 기능을 세밀하게 조정하여 로그를 처리하는 것이 가능합니다. 

 

resources 아래에 logback-spring.xml 파일을 생성한 후 아래와 같이 작성해줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 콘솔에 log 기록 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level ${PID:-} --- [%15.15thread] %-40.40logger{36} : %msg%n</Pattern>
        </layout>
    </appender>

    <!-- log root 레벨 설정 (logging.level.root=info)-->
    <root level="debug">
        <!--     참조할 appender 설정 - STDOUT -->
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

위 코드를 자세히 살펴보겠습니다. 

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
	...
</appender>

큰솔에 로그를 출력하기 위해 아래와 같이 appender을 정의하고, 이후 name을 통해 참조하게 됩니다.

<layout class="ch.qos.logback.classic.PatternLayout">
    	...
</layout>

로그 메세지의 레이아웃을 정의합니다. 여기서는 Pattern 레이아웃을 사용하도록 설정하였습니다.

<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger{36}] - %msg%n</Pattern>

어떠한 패턴을 사용할 것인지 정의해줍니다. 

- %d{yyyy-MM-dd HH:mm:ss.SSS} : 로그 이벤트가 발생한 시간

- [%level] : 로그 레벨

- [%thread] - 로그 이벤트가 발생한 스레드 이름

- [%logger{36}] - 로그 이벤트를 발생시킨 주체의 이름을 최대 36자까지만 출력

- %msg : 로그 이벤트의 메시지

 

debug 레벨까지 로그 출력

 


✔️ 큰솔 로그에 색상 설정하기

사실 위에서 pattern을 정의하긴 했지만, 스프링부트에서 제공하는 defaults.xml을 참고하여 동일하게 설정해주면 됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

    <property name="CONSOLE_LOG_PATTERN"
              value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative]  %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint} %clr([%15.15thread]){faint} %clr(%-40.40logger{36}){cyan} %clr(:){faint} %msg%n"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        </layout>
    </appender>

    <root level="debug">
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

 

예쁘게 잘 출력되네용😆

 


References

- https://cl8d.tistory.com/96

- https://loosie.tistory.com/829