본문 바로가기

Server/Spring

Spring boot logback 설정

Spring boot logback 설정

  • classpath(resource디렉토리 밑)에 logback-spring.xml파일이 있으면 Boot가 설정파일을 읽어감.
  • logback-spring.xml파일이 없다면 .yml(.properties)파일의 설정을 보게됨.

설정시 특징

<appender name="privateLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${LOG_PATH}/private.${port:-default}.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH}/private.${port:-default}.log.%d{yyyy-MM-dd}</fileNamePattern>
    <maxHistory>7</maxHistory>
  </rollingPolicy>
  <encoder>
    <pattern>%replace(%msg){'\n', ' '}%n</pattern>
  </encoder>
</appender>
  • ${LOG_PATH} 변수에 들어가는 값을 .yml파일에 속성 값이 있다면 그것을 가져옴.
  • file 태그 지정시 fileNamePattern 태그 설정이 생략되고 file 태그가 설정됨 -> file태그가 없을 경우 fileNamePattern태그 설정이 활성화됨.

spring:
  profiles: default
  jackson.serialization.FAIL_ON_EMPTY_BEANS: false
logging:
  path: logs //이 값이 ${LOG_PATH}로 들어가게됨.
  level.org.hibernate:
    SQL: DEBUG
    type.descriptor.sql.BasicBinder: TRACE
  • logback-spring.xml파일과 .yml파일이 동시에 있다면 .yml 설정 파일을 먼저 적용 후 xml파일이 적용되는 것을 확인함.

<springProfile name="default">
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>
  <root level="DEBUG">
    <appender-ref ref="appAppender"/>
  </root>
</springProfile>

<springProfile name="default">
  <root level="DEBUG">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="appAppender"/>
  </root>
</springProfile>
  • spring profile 설정 시 첫번째 설정처럼 따로 root를 설정하는 것은 두번째 설정과 같다. 즉, 마지막 root태그 속성이 설정되고 그전 속성은 씹힌다.

logger element

  • 대소문자 구별 x -> <logger/> == <LOGGER/>
  • name attribute를 반드시 지정해야함
  • level, additivity attribute는 optional

root element

  • It supports a single attribute, namely the level attribute

Note that unlike log4j, logback-classic does not close nor remove any previously referenced appenders when configuring the root logger. Similarly to the <logger> element, the <root> element may contain zero or more <appender-ref> elements; each appender thus referenced is added to the root logger. Note that unlike log4j, logback-classic does not close nor remove any previously referenced appenders when configuring the root logger.

Example

Suppose we are no longer interested in seeing any DEBUG messages from any component belonging to the “chapters.configuration” package. The following configuration file shows how to achieve that.

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- chapters.configuration 패키지의 하위 구성은 모두 level="INFO"로 적용 -->
  <logger name="chapters.configuration" level="INFO"/>

  <!-- Strictly speaking, the level attribute is not necessary since -->
  <!-- the level of the root level is set to DEBUG by default.       -->
  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>

</configuration>

<springProfile name="default"> <logger name="org.codingsquid.logback.setting" level="INFO" additivity="false"> <appender-ref ref="STDOUT"/> </logger> <root level="DEBUG"> <appender-ref ref="appAppender"/> </root> </springProfile>

  • 위와 같이 설정시 com.kakaopay.voyager.batch밑 패키지는 INFO로 레벨이 설정 appender-ref는 출력 방법을 설정하는 것임
  • root level=“DEBUG” 는 appAppender를 참조 하고 있으므로 appAppender는 디버그 레벨로 로그를 출력하게 됨. 출력방법은 appAppender로 설정된 출력방법으로 출력.

Spring Boot & Logback

Logback extensions

spring-boot에서는 Logback을 사용. Web Application을 가동하면 classpath 내에서 환경 설정 파일(logback.xml(logback-text.xml))을 검색해서 logback을 초기화시킴. 이때는 아직 Spring이 구동되기 전의 시점임. spring-boot에서는 logback-spring.xml을 사용해서 Spring이 logback을 구동할 수 있도록 지원해줌. 덕분에 profile이나 application.xml에 설정된 properties를 읽어올 수 있음.

Logging 관련 Spring Boot properties

  • Spring boot 환경에서 springProfile 관련 태그를 이용하려면 logback 스탠다드 파일인 logback.xml을 사용하면 안됨. logback-spring.xml파일을 사용해야함.

You cannot use extensions in the standard logback.xml configuration file since it’s loaded too early. You need to either use logback-spring.xml or define a logging.config property.

같은 SpringProfile에서 root element밑에서 각각의 appender를 다른 레벨로 로그를 출력하려면 어떻게 해야할까???

로그설정을 진행하면서 구조를 파악해본 결과 appender들을 선택하여 개인 입맛에 맞게 (encoder를 이용하여 charset이나 pattern을 지정하는 등)설정 한후 이것을 appender-ref를 통해 참조하게 하여 로그 남기는 방법을 커스터마이징 하는 구조다.