본문 바로가기
우아한테크코스 4기/레벨3

[Logback] Spring Logback configuration 과정 (2) - Spring

by 나는후니 2022. 7. 17.

이번 포스팅에는 Spring profile 별, 에러 레벨 별로 다른 로그 정책을 설정하는 방법에 대해 소개해보겠습니다.

지난 포스팅에 살짝 언급했듯 Spring은 기본 로깅 전략을 담은 파일을 갖고 있습니다.

<!--> base.xml <-->
<included>
  <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
  <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
  <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
  <root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
  </root>
</included>
​

지난 포스팅에 소개했었던 console-appenderfile-appender를 사용하고 INFO 레벨일 때 해당 appender를 적용하는 설정 파일이고, 우리가 스프링을 실행하면 볼 수 있는 로그이기도 합니다.

{LOG_FILE:- default} 형태는 LOG_FILE이라는 property가 존재하지 않을 경우, 기본 값으로 default를 사용하겠다는 의미입니다.
property는 <property name = "LOG_FILE" value = "error.log"> 와 같이 key-value 형태로 지정할 수 있습니다.

어떠한 로그 설정도 없으면 이 설정 파일에 맞게 로그를 생성합니다. 하지만 우리는 우리의 입맛에 맞게 로깅 설정을 하고 싶습니다. (파일 등등 ..)

그럴 땐 어떻게 할 수 있을까요?

Spring - Configure Logback for logging

스프링 공식 문서에서는 아래와 같이 설명합니다.

logback.xml 이나 Boot에서 제공하는 템플릿 기능의 이점을 누리기 위한 logback-spring.xml 을 루트 클래스 path에 설정해두면 Spring이 해당 전략을 선택합니다.

즉, Spring Boot에서 로그백 설정을 하기 위한 가장 최적의 방법은 root class pathlogback-spring.xml 파일을 생성하는 것입니다.

logback-spring.xml

이제 파일을 하나 생성하고 기본 틀을 작성해봅니다.

<configuration>
  
</configuration>

간단하게 로그백 설정의 시작을 알리는 코드라고 생각하면 좋습니다. 상세 내용은 링크를 참조하세요. 다양한 기능들이 있으니 꼭 봐두면 좋을 것 같습니다.

먼저, 원하는 로깅 전략을 appender 설정으로 하나 생성합니다.

<configuration>
  <appender name="file-error-logger" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${LOG_PATH}/error.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>utf-8</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
    </appender>
</configuration>

ERROR레벨의 로그만 허락하는 filter를 가진 RollingFileAppender가 하나 생겼습니다. 이 appender의 이름은 file-error-logger입니다.

이제부터 Spring의 설정을 넣어보겠습니다.

<configuration>
  <!-->file-error-logger 생략..<-->
  <springProfile name="local">
        <logger name="com.example" level="ERROR">
            <appender-ref ref="file-error-logger"/>
        </logger>
   </springProfile>
</configuration>
  • <springProfile> : 이 설정은 실행 profile 별로 다른 로깅 설정을 참조할 수 있도록 돕습니다. 지금처럼 local하나만 설정할 수도 있고, dev, prod 이런 식으로 두가지의 profile에 걸쳐 함께 설정을 사용하도록 유지할 수도 있습니다.
  • <logger> : name 하위 클래스, ERROR 레벨을 대상으로 범위를 지정합니다.
  • <appender-ref> : appender의 이름으로 로깅 설정을 참조합니다.

이제 끝입니다. 하지만 이 상태로 실행한다면, 기본 로그가 보이지 않습니다. LogBack은 logback-spring.xml을 먼저 탐색하고 없을 경우 base.xml을 참조하여 로깅하는데 지금은 base.xml을 탐색하지 못하고 있죠. 따라서 INFO레벨의 로그에 대해서는 아래와 같이 추가해줄 수 있습니다.

<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/> <!-->최상위에 둠으로써 모든 spring profile INFO 레벨에 적용<-->
  <!-->file-error-logger 생략..<-->
  <springProfile name="local">
        <logger name="com.example" level="ERROR">
            <appender-ref ref="file-error-logger"/>
        </logger>
   </springProfile>
</configuration>

이처럼 Spring Profile별로 로그 전략을 달리 설정할 수 있습니다. 만약 로그 설정이 많아진다면 <included><include resource> 그리고 <appender-ref>를 이용하여 로그 설정을 분리하고 가독성을 높일 수 있습니다.

 

이것으로 Spring Profile 별 로깅 설정 방법에 대한 글을 마치겠습니다 !!