사내에서 배포 시 nohup 으로 application을 띄우고 로그에 logrotate 하는 것을
서비스 등록하고 logback 설정을 통해 rotate 할 수 있도록 변경하는 과정에서 알게된 내용이다.
Springboot 는 "starters" 사용 시 기본적으로 logback을 사용한다.
기본 설정은 console 에 log 를 찍는다. 운영 로그를 보기 위해선 파일로 남기는 것이 좋고, 적절한 rolling 정책을 지정해주는 것이 좋다.
application.yml 파일 또는 logback 설정 xml 파일을 직접 만들어 로그 관련 설정을 할 수 있다.
세부 설정을 하기 위해 xml 파일을 통해 만들자.
(application.yml 설정을 사용하는 경우 문서를 참조하자)
logback을 사용하므로, resources/ 하위에 logback-spring.xml 파일을 생성하자.
이 파일에서부턴 logback 의 설정을 사용하므로, logback 관련 메뉴얼을 확인해서 만들면 된다.
생성한 설정 파일은 아래와 같다.
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_DIR" value="/home/kangsan/test/logs"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %magenta(%-4relative) --- [ %thread{10} ] %cyan(%logger{20}) : %msg%n </pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/vpki.current.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-4relative --- [ %thread{10} ] %logger{35} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/vpki.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>365</maxHistory>
</rollingPolicy>
</appender>
<logger name="org.springframework" level="info"/>
<logger name="org.hibernate" level="info"/>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
옵션에 대한 간략한 설명
$ java -DLOG_DIR=/var/log/application com.baeldung.logback.LogbackTests 이런식으로 Property 값을 채워서 줄 수 있다.
<appender-ref> 를 통해 위에서 정의한 appender 를 달아준다.For various technical reasons, rollovers are not clock-driven but depend on the arrival of logging events. For example, on 8th of March 2002, assuming the fileNamePattern is set to yyyy-MM-dd (daily rollover), the arrival of the first event after midnight will trigger a rollover. If there are no logging events during, say 23 minutes and 47 seconds after midnight, then rollover will actually occur at 00:23'47 AM on March 9th and not at 0:00 AM. Thus, depending on the arrival rate of events, rollovers might be triggered with some latency. However, regardless of the delay, the rollover algorithm is known to be correct, in the sense that all logging events generated during a certain period will be output in the correct file delimiting that period.
rollover 는 logging 이벤트 도착 기준으로 동작한다. 그래서 시간 기준으로 rolling을 한다해도 정확히 그 시간에 rolling이 일어나지 않을 수 있다.
1분마다 rolling하도록 설정 후 테스트 해서 동작 방식을 확인하였다.
11분부터 14분까지 로그 이벤트를 발생시키고, 5분 후 19분에 이벤트 발생시키니 15분 아카이브가 생성됨.

1분 후 20분에 로그 이벤트를 발생시키니 19분 아카이브가 생성됨

즉 1분마다 rolling 정책을 설정했어도, 로그 이벤트가 없다면 따로 아카이브 하지 않는다는것과 아카이브 시점은 시간 기준이 아닌 로그 이벤트가 발생된 순간에 trigger 됨을 알 수 있었다.
참고
https://www.baeldung.com/logback
https://meetup.toast.com/posts/149