본문 바로가기

Dev/Spring Boot

스프링부트 공통 설정 그놈 Logback

먼저 로그를 사용하는 이유부터 살펴보자.. 크게 아래의 두가지 이유와 같을 것이다.

  • 대게 에러가 발생했을 때 해당 내용을 알아보고 재현하기 위해서 사용
  • 별도의 파일로 남겨서 내용을 분석하기 위해 로그를 사용
  • 로그 수준은 크게 (TRACE < DEBUG < INFO < WARN < ERROR)로 구분되며 오른쪽으로 갈수록 더 높은 레벨이며 상세하다.
  • 출력 레벨의 설정에 따라서 그 레벨 이상의 로그를 출력한다. ex) INFO 로 설정할 경우 TRACE, DEBUG 레벨은 무시

logback에 대하여?

  • slf4j의 구현체로 스프링 부트의 기본 로그 객체이다.
  • spring-boot-starter-web 라이브러리에 logback-classic, logback-core가 탑재되어 있음
  • log4j, log4j2 에 비해 logback 성능이 좋다.
  • 특정로그를 콘솔을 통해 출력하거나 파일을 통해서 남길 수 있다.

간단한 수준의 콘솔에서 로그를 수정하는 것은 설정파일(.yml)을 통해 수정이 가능하다.

// application.yml
logging:
  level:
    org.springframework: INFO
    org.springframework.web: DEBUG

하지만 실제로 사용하기에는 세부내용을 설정하기가 힘들다.

 - 보통 별도의 설정파일 logback-spring.xml 파일을 통해 세부내용을 설정하여 사용한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOGS_ABSOLUTE_PATH" value="./logs" />

    <!-- Console에 로그를 기록 -->
    <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][%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>

    <!-- 파일에 로그를 기록 -->
    <appender name="FILE" 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.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 로그 파일의 최대 용량 -->
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 일자별 로그의 최대 생명주기(일) 30일지나면 해당일 지난 파일은 삭제됨 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!--
         root 레벨 설정
         전역적인 설정
    -->
    <root level="INFO">
        <appender-ref ref="Console" />
    </root>

    <!--
        org.springframework.web 하위 동작하는 디버그 로그를 콘솔, 파일에 출력
        지역적인 설정
    -->
    <logger name="org.springframework.web" level="DEBUG">
        <appender-ref ref="Console" />
        <appender-ref ref="FILE" />
    </logger>
</configuration>

logback-spring.xml 설정파일에서는 크게 appender과 logger로 나눌 수 있다.

  • appender는 콘솔, 파일 등의 로그를 출력하는 방법을 지정
  • logger는 출력할 곳을 설정한다.
  • 아래는 로그가 찍힐 때 기록하는 내용을 보여준다.
// 콘솔에 출력되는 내용
[2021-04-07 23:00:35:17226][http-nio-8085-exec-1] INFO  LogService - Info
[2021-04-07 23:00:35:17226][http-nio-8085-exec-1] WARN  LogService - Warn
[2021-04-07 23:00:35:17226][http-nio-8085-exec-1] ERROR LogService - Error

// 파일에 기록되는 내용
[2021-04-07 23:00:35:17245][http-nio-8085-exec-1] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'text/html', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, */*;q=0.8] and supported [text/plain, */*, text/plain, */*, application/json, application/*+json, application/json, application/*+json]
[2021-04-07 23:00:35:17245][http-nio-8085-exec-1] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'text/html', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, */*;q=0.8] and supported [text/plain, */*, text/plain, */*, application/json, application/*+json, application/json, application/*+json]
[2021-04-07 23:00:35:17246][http-nio-8085-exec-1] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing ["console log"]
[2021-04-07 23:00:35:17246][http-nio-8085-exec-1] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing ["console log"]
[2021-04-07 23:00:35:17256][http-nio-8085-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Completed 200 OK
[2021-04-07 23:00:35:17256][http-nio-8085-exec-1] DEBUG o.s.web.servlet.DispatcherServlet - Completed 200 OK

참고한 블로그

https://www.sangkon.com/hands-on-springboot-logging/

 

Spring Boot - Logging, 20분 정리

결론적으로 말하고 싶은건 프로젝트 시작시 Logback 부터 설정하자. 개발의 시작은 Logger 설정부터 아니겠는가? 스프링 부트의 로깅 잔혹사 태초에 스프링은 JCL(Jakarta Commons Logging)을 사용해서 로깅

www.sangkon.com

https://goddaehee.tistory.com/206

 

[스프링부트 (5)] Spring Boot 로그 설정(1) - Logback

[스프링부트 (5)] Spring Boot Log 설정(1) - Logback 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링 부트 Log 설정 - 로그백] 입니다. : -) 1. Logback 이란? 특징?  - 자바 오픈소스 로깅 프레임..

goddaehee.tistory.com