[SpringBoot] 로깅 처리

1. SpringBoot Logging

스프링부트는 Commons Logging을 사용한다. Java Util Logging, Log4J, Log4J2 and Logback에 대한 기본설정을 제공한다.

2. 로그 출력형태

스프링부트에서 출력하는 기본로그 형태
2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

출력되는 내용은 다음과 같다. * 날짜와 시간: 밀리세컨드단위로 되어 정렬가능 * 로그레벨: ERROR,WARN, INFO, DEBUG or TRACE * 프로세스ID * ---: 를 통해서 실제 로그 메시지와 구분 * 스레드 네임 * 로거 네임: 로그가 찍히는 위치 * 로그 메시지


로그백Logback에서는 FATAL 레벨이 없다(ERROR로 매핑됨)

3. logback.xml 설정

스프링부트에서는 클래스패스classpath 상에서 루트에 logback.xml이 존재하면 해당설정파일을 로깅설정에 적용한다. 그래서 스프링부트에서는 logback-spring.xml으로 설정하는 것을 권장한다. 이렇게 해두고 설정파일에서 logging.config: classpath:logback-spring.xml과 같은 형태로 설정하면 로그설정을 추가등록한다.

스프링부트에서 생성하는 로그 설정은 대략 다음과 같다.

스프링 환경시스템 속성설명
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD로깅 예외발생시 사용할 관례적인 단어
logging.fileLOG_FILE정의되어 있다면 기본로그 설정에 사용됨
logging.pathLOG_PATH정의되어 있다면 기본로그 설정에 사용됨
logging.pattern.consoleCONSOLE_LOG_PATTERN콘솔에 출력되는 로그 패턴(stdout). (JDK 로거는 지원하지 않음)
logging.pattern.fileFILE_LOG_PATTERN파일에 사용될 로그 패턴(LOG_FILE 활성화된 경우). (JDK 로거는 지원하지 않음)
logging.pattern.levelLOG_LEVEL_PATTERN출력 로그레벨 형태 사용(기본%5p). (logging.pattern.level형태는 로그백에서만 지원)
PIDPID현재 프로세스 ID(OS 환경 변수로 정의되지 않은 경우에는 발견)

4. 로그백Logback 확장

스프링부트에서는 logback-spring.xml을 설정하길 권장한다. logback.xml로 설정하면 스프링부트가 설정하기 전에 로그백 관련한 설정을 하기 때문에 제어할 수가 없게 된다.

5. 스프링부트의 로그 설정을 유지하면서 로그백을 통해서 일일 로그파일 남기기

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
 
<appender name="dailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<prudent>true</prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>applicatoin.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
 
<encoder>
<pattern>%d{yyyy:MM:dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n</pattern>
</encoder>
</appender>
 
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.thymeleaf" level="INFO"/>
<logger name="org.hibernate.SQL" level="INFO"/>
<logger name="org.quartz.core" level="INFO"/>
<logger name="org.h2.server.web" level="INFO"/>
 
<root level="INFO">
<appender-ref ref="dailyRollingFileAppender" />
</root>
</configuration>

위의 형태로 logback-spring.xml을 만들어서 ${project}/src/main/resources 에 위치시키고 application.properties 혹은 application.yml에 다음과 같이 설정한다.

  1. 애플리케이션 내 로그레벨 설정

spring.profiles: logging-info
logging:
  file: logs/application.log
  level:
    org.thymeleaf: INFO
    org.springframework.web: INFO
    org.hibernate.SQL: INFO
    org.quartz.core: INFO
    org.h2.server.web: INFO
 
---
spring.profiles: logging-debug
logging:
  file: logs/application.log
  level:
    org.thymeleaf: DEBUG
    org.springframework.web: DEBUG
    org.hibernate.SQL: DEBUG
    org.quartz.core: DEBUG
    org.h2.server.web: DEBUG
 
---
spring.profiles: logging-daily
logging:
  config: classpath:logback-spring.xml

6. 로그파일 실행

$ java -jar application.jar --spring.profiles.active=logging-debug,logging-daily

위의 형태로 실행하면, 실행한 위치에는 logback-spring.xml 설정에 의해 생성된 로그는application.2015-11-03.log 파일이 생성되고, application.yml에 설정한 logging.* 관련한 로그는 logs/application.log이 생성된다.


  1. 신미성 2019.07.05 23:21

    와 한번에 되는 코드 오랜만에 보는거 같네요^^ 감사합니다.

몰랐네. +_+)> logback.groovy    



이왕 그루비를 파기로 했으니, 계속 파보자.

+ Recent posts