Springboot logback 적용
- springboot logback 이란, 스프링부트 프로세스에서 발생하는 로그들의 형식을 정해주는 기능입니다.
예를들어 test 라는 로그를 남길 때,
import org.slf4j.Logger
import org.slf4j.LoggerFactory
private val classLogger: Logger = LoggerFactory.getLogger(this::class.java)
fun test(){
classLogger.info("test")
}
위와 같이 로깅을 하는데,
의도대로라면 로그에 "test" 만 찍혀야 하겠죠?
하지만 운영 단계에서는 해당 로그가 찍힌 시간, 로그의 중요도, 실행된 스레드가 무엇인지 등을 자동으로 로깅하고 싶을 수도 있습니다.
그렇다면 위와 같은 로깅 코드마다 각 정보를 일일이 넣어줘야 하는데, logback 을 설정하면 이러한 정보가 자동으로 입력됩니다.
그뿐아니라 로그가 콘솔창 외에도 파일로 저장되게도 할 수 있고, 파일 저장이라면 파일의 크기가 몇 이상이면 파일을 분할하게 할 수도 있고, 로그 파일명의 규칙이나 저장 위치도 설정이 가능하며,
Slack, 이메일 등으로 로그가 발송되도록 할 수도 있습니다.
이번 글에서는 기본적으로 로그를 콘솔에 출력할 때의 양식과 파일로 출력될 때의 설정,
그리고 Springboot 프로필 설정별 로깅 방식 변경에 대한 처리 방법을 정리하겠습니다.
- 실습은 간단합니다.
application.yml 파일이 존재하는 resources 폴더 안에, logback-spring.xml 파일을 만들고,
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
[로그 패턴]
1. yyyy_MM_dd... : 현재 일시
2. %relative : 서버가 시작된 이후의 밀리초
3. %level : 로그 레벨
4. %thread : 사용 쓰레드
5. %logger : 사용 로거
6. %msg : 로깅 메시지
-->
<!--로그 파일 저장 위치-->
<property name="LOGS_PATH" value="./by_product_files/test/logs"/>
<!--local 프로필 환경-->
<springProfile name="local">
<!-- File 에 로그 출력 세팅 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 출력패턴 설정-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%-5level] [%msg] [le]%n
</pattern>
</encoder>
<!-- Rolling 정책 : 로그 보관 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 로그 백업 파일 경로 설정 -->
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOGS_PATH}/local_%d{yyyy_MM_dd}(%i).log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
<!-- 파일당 최고 용량 KB, MB, GB -->
<!-- 아래 용량을 넘으면 파일 분할-->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- CONSOLE 에 로그 출력 세팅 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%highlight(%-5level)] [%msg] [le]%n
</pattern>
</layout>
</appender>
<!-- <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
<!-- <!– 로그 스태시 주소 –>-->
<!-- <destination>localhost:5000</destination>-->
<!-- <encoder class="net.logstash.logback.encoder.LogstashEncoder">-->
<!-- </encoder>-->
<!-- </appender>-->
<!-- appender 별 세팅 -->
<!-- 로그 전역 세팅 -->
<!-- 로그 레벨 -->
<!--
1) ERROR : 오류 메시지 표시
2) WARN : 경고성 메시지 표시
3) INFO : 정보성 메시지 표시
4) DEBUG : 디버깅하기 위한 메시지 표시
5) TRACE : Debug보다 훨씬 상세한 메시지 표시
예를들어 info 로 설정시, INFO 보다 위에 있는 DEBUG 와 TRACE 는 표시하지 않는다.
-->
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
<!-- <appender-ref ref="LOGSTASH"/>-->
</root>
</springProfile>
<!--dev 프로필 환경-->
<springProfile name="dev">
<!-- File 에 로그 출력 세팅 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 출력패턴 설정-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%-5level] [%msg] [le]%n
</pattern>
</encoder>
<!-- Rolling 정책 : 로그 보관 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 로그 백업 파일 경로 설정 -->
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOGS_PATH}/dev_%d{yyyy_MM_dd}(%i).log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
<!-- 파일당 최고 용량 KB, MB, GB -->
<!-- 아래 용량을 넘으면 파일 분할-->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
<!-- <!– 로그 스태시 주소 –>-->
<!-- <destination>localhost:5000</destination>-->
<!-- <encoder class="net.logstash.logback.encoder.LogstashEncoder">-->
<!-- </encoder>-->
<!-- </appender>-->
<!-- appender 별 세팅 -->
<!-- 로그 전역 세팅 -->
<!-- 로그 레벨 -->
<!--
1) ERROR : 오류 메시지 표시
2) WARN : 경고성 메시지 표시
3) INFO : 정보성 메시지 표시
4) DEBUG : 디버깅하기 위한 메시지 표시
5) TRACE : Debug보다 훨씬 상세한 메시지 표시
예를들어 info 로 설정시, INFO 보다 위에 있는 DEBUG 와 TRACE 는 표시하지 않는다.
-->
<root level="INFO">
<appender-ref ref="FILE"/>
<!-- <appender-ref ref="LOGSTASH"/>-->
</root>
</springProfile>
<!--prod 프로필 환경-->
<springProfile name="prod">
<!-- File 에 로그 출력 세팅 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 출력패턴 설정-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%-5level] [%msg] [le]%n
</pattern>
</encoder>
<!-- Rolling 정책 : 로그 보관 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 로그 백업 파일 경로 설정 -->
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOGS_PATH}/prod_%d{yyyy_MM_dd}(%i).log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
<!-- 파일당 최고 용량 KB, MB, GB -->
<!-- 아래 용량을 넘으면 파일 분할-->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
<!-- <!– 로그 스태시 주소 –>-->
<!-- <destination>localhost:5000</destination>-->
<!-- <encoder class="net.logstash.logback.encoder.LogstashEncoder">-->
<!-- </encoder>-->
<!-- </appender>-->
<!-- appender 별 세팅 -->
<!-- 로그 전역 세팅 -->
<!-- 로그 레벨 -->
<!--
1) ERROR : 오류 메시지 표시
2) WARN : 경고성 메시지 표시
3) INFO : 정보성 메시지 표시
4) DEBUG : 디버깅하기 위한 메시지 표시
5) TRACE : Debug보다 훨씬 상세한 메시지 표시
예를들어 info 로 설정시, INFO 보다 위에 있는 DEBUG 와 TRACE 는 표시하지 않는다.
-->
<root level="INFO">
<appender-ref ref="FILE"/>
<!-- <appender-ref ref="LOGSTASH"/>-->
</root>
</springProfile>
</configuration>
위와 같이 입력만 하면 끝입니다.
위에서부터 설명하자면,
맨 위의 property 에는 LOGS_PATH 라는 이름의 변수를 생성한 것입니다.
이를 xml 안에서 ${LOGS_PATH} 라는 방식으로 사용 가능합니다.
springProfile 은 각각의 name 에 해당하는 프로필이 실행되었을 때 해당 태그 안의 내용을 실행시키겠다는 것으로, 저는 application-local, application-dev, application-prod 라는 프로필이 있으므로, local, dev, prod 라는 설정을 각각 해주었습니다.
프로필 태그 안에는 appender 를 설정합니다.
appender 는 로그가 출력될 위치입니다.
FILE appender 는 로그를 파일에, CONSOLE appender 는 로그를 콘솔에 출력하며, 둘 모두 로깅 패턴은 구분이 쉽도록 [ls] 로 시작하여, 날짜, 로그 레벨, 메시지, [le]%n 으로 끝이 납니다.
파일의 경우는 10MB 를 넘으면 분할하도록 하였고, 파일명은 프로필_날짜(인덱스).log 라는 형식을 사용하였습니다.
마지막으로 위와 같이 생성한 appender 를 root 안에 넣어주면 해당 appender 로 로그가 전달되어 처리되는 것입니다.
자세한 내용은 위 주석을 참고하시고,
이제 더이상 다른 부분을 손대지 마시고 바로 실행을 하시면,
위와 같이 로그 형식이 잘 변형되었으며,
로그 파일 역시 잘 저장되었음을 볼 수 있습니다.
- 이상입니다.