문제
서버의 disk 공간 사용량이 90%를 넘겼다는 에러 메세지를 받았다.
문제 원인
서버에서 로그를 쌓는 폴더 중 용량이 큰 걸 찾아봤더니, access log 파일 폴더였다.
현재 2023년 4월이니, 2022년 8월부터 현재까지 8개월치의 로그가 쌓여있었다.
문제 해결
Logback에서 RollingFile을 설정하여 자동으로 주기적으로 로그가 삭제되도록 설정을 추가하기로 했다.
SLF4j와 Logback
SLF4j는 가장 오래된 프레임워크이며 Apache 의 Java 기반 Logging Framework다. Logback은 log4j 이후에 출시된 Java 기반 Logging Framework 중 하나로 가장 널리 사용되고 있다. SLF4j 의 구현체이며 Spring Boot 환경이라면 별도의 dependency 추가 없이 기본적으로 포함되어 있다.
RollingFile
RollingFile은 Logback에서 제공하는 Appender 중 하나이다. RollingFile Appender는 로그 파일이 일정 크기나 날짜 등 지정된 조건에 따라 자동으로 분리되도록 설정할 수 있다. 이를 통해 일정 기간 이전의 로그 파일을 삭제하고나, 백업하고, 과도한 로그 파일의 크기 증가를 방지할 수 있다.
참고로, Logback에서 기본적으로 제공되는 Appender 종류는 아래와 같다.
- ConsoleAppender: 콘솔에 로그를 출력한다.
- FileAppender: 파일에 로그를 출력한다.
- RollingFileAppender: 일정 크기 또는 일정 기간이 지나면 파일을 분리하여 로그를 출력한다.
- AsyncAppender: 로그 출력을 비동기화한다.
- SocketAppender: 소켓을 통해 로그를 전송한다.
- SMTPAppender: 이메일로 로그를 전송한다.
- DBAppender: 데이터베이스에 로그를 저장한다.
- SyslogAppender: 시스템 로그에 로그를 출력한다.
Spring에서 Logback 설정
Spring에서 콘솔 로그의 수준을 변경하는 방법은 application.yml 과 logback-spring.xml 에서 설정하는 방법이 있다. application.yml 은 설정하는 난이도가 비교적 쉽지만, 실제 제품에 사용하기엔 한계가 있고 세부적인 설정이 불편하기 때문에 logback-spring.xml 로 관리한다.
logback-spring.xml에 내용이 많아지면, 특정 설정을 따로 xml 파일로 만들어 include 해줄 수 있다.
access log에 RollingFile 설정해주는 logback-access.xml을 만들고, logback-spring.xml에 include 해줬다.
아래는 logback-access.xml 내의 내용이다.
<included>
<appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/access/access_log</file>
<encoder>
<pattern>combined</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/access/access_log.%d{yyyyMMdd}-%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>90</maxHistory>
<totalSizeCap>30GB</totalSizeCap>
</rollingPolicy>
</appender>
<appender-ref ref="ACCESS" />
</include>
- maxFileSize: 파일 분할 용량으로 KB, MB, GB가 있다.
- maxHistory: 파일이 저장될 수 있는 기간을 설정한다. 여기선 90일이다.
- totalSizeCap: 전체 파일 크기를 제어하여, 전체 크기 제한을 초과하면 가장 오래된 파일을 삭제한다.
- appender-ref: 사용하고자 하는 appender을 등록한다. 위에서 작성한 appender의 name을 적어주면 된다.
logback-spring.xml에선 아래와 같이 logback-access.xml 를 include해주면 된다.
Spring의 Profile에 따른 LOGBACK 설정
Spring의 Profile에 따라 아래와 같이 logback-spring.xml에서 Logback 설정을 다르게 할 수 있다.
이 때, appender-ref 사용하면 된다.
test 실행 중이거나 profile이 dev이면 CONSOLE appender를 사용한다. 즉, 로그가 콘솔에 찍히게 한다.
test가 아니고, 사용된 profile이 dev가 아니면 FILE, IMON, ACCESS 조합으로 LOGBACK을 설정한다.
- root: 전체 프로젝트의 로그 레벨을 설정한다. 여기서는 INFO로 설정했다.
참고 자료
https://tecoble.techcourse.co.kr/post/2021-08-07-logback-tutorial/
https://logback.qos.ch/manual/appenders.html
https://velog.io/@backtony/Spring-%EB%A1%9C%EA%B7%B8-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-Logback
https://rutgo-letsgo.tistory.com/118