프로그래밍/spring
LogBack(Slf4j)로 로그 레벨에 따라 로그 파일 만들기
승민아
2024. 3. 24. 16:05
Slf4j는 라이브러리 인터페이스이고, 그 구현체로 LogBack이 있는것이다.
resources 아래에 logback-spring.xml 파일을 생성하고 작성하여 로그 설정을 한다.
LogBack은
Error > Warn > Info > Debug > Trace 순으로 로그 레벨이 나눠진다.
logback-spring.xml 의 전체 코드를 이해하기전 부분부분 이해해보자.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
- appender : 로그의 형태, 로그 메시지를 콘솔에 출력할지 파일로 출력할지 출력 대상을 정할 수 있다.
- name : STDOUT이라는 이름으로 변수를 저장했다고 생각하면 된다.
- class : ConsoleAppender는 콘솔에 출력을, FileAppender는 파일에 출력을 한다.
- RollingFileAppender는 FileAppender를 상속 받는다.
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_LOG"/>
<appender-ref ref="WARN_LOG"/>
<appender-ref ref="ERROR_LOG"/>
</root>
- root : 모든 로그를 처리하는 최상단이다.
- level : INFO 단계의 이상의 로그들을 처리한다.
- appender-ref : 로그 이벤트를 appender로 라우팅해준다.
- ref : 참조할 appender를 지정한다.
<appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./info.txt</file> <!-- 파일을 저장할 경로를 정한다 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
<onMismatch>DENY
</onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
</filter> <!-- 레벨별 필터링이 필요없을 경우 filter class 관련된 부분을 삭제하면 됨-->
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n
</pattern> <!-- 해당 패턴 네이밍으로 현재 로그가 기록됨 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./was-logs/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 해당 패턴 네이밍으로 이전 파일이 기록됨 -->
<maxFileSize>1MB</maxFileSize> <!-- 한 파일의 최대 용량 -->
<maxHistory>2</maxHistory> <!-- 한 파일의 최대 저장 기한 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
- RollingFileAppender의 하위 요소로 rollingPolicy, triggeringPolicy가 있다.
- rollingPolicy : 롤 오버에 필요한 작업을 정의, 무엇을 할지와 같음.
- triggeringPolicy : 롤 오버가 발생하는 여부와 시기를 정의, 언제할지와 같음.
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_LOG"/>
<appender-ref ref="WARN_LOG"/>
<appender-ref ref="ERROR_LOG"/>
</root>
<appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./info.txt</file> <!-- 파일을 저장할 경로를 정한다 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
<onMismatch>DENY</onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
</filter> <!-- 레벨별 필터링이 필요없을 경우 filter class 관련된 부분을 삭제하면 됨-->
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> <!-- 해당 패턴 네이밍으로 현재 로그가 기록됨 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./was-logs/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 해당 패턴 네이밍으로 이전 파일이 기록됨 -->
<maxFileSize>20KB</maxFileSize> <!-- 한 파일의 최대 용량 -->
<maxHistory>2</maxHistory> <!-- 한 파일의 최대 저장 기한 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="WARN_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./warn.txt</file> <!-- 파일을 저장할 경로를 정한다 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
<onMismatch>DENY</onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
</filter> <!-- 레벨별 필터링이 필요없을 경우 filter class 관련된 부분을 삭제하면 됨-->
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> <!-- 해당 패턴 네이밍으로 현재 로그가 기록됨 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./was-logs/warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 해당 패턴 네이밍으로 이전 파일이 기록됨 -->
<maxFileSize>1MB</maxFileSize> <!-- 한 파일의 최대 용량 -->
<maxHistory>2</maxHistory> <!-- 한 파일의 최대 저장 기한 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./error.txt</file> <!-- 파일을 저장할 경로를 정한다 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
<onMismatch>DENY</onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
</filter> <!-- 레벨별 필터링이 필요없을 경우 filter class 관련된 부분을 삭제하면 됨-->
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> <!-- 해당 패턴 네이밍으로 현재 로그가 기록됨 -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>./was-logs/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 해당 패턴 네이밍으로 이전 파일이 기록됨 -->
<maxFileSize>1MB</maxFileSize> <!-- 한 파일의 최대 용량 -->
<totalSizeCap>1GB</totalSizeCap>
<maxHistory>2</maxHistory> <!-- 한 파일의 최대 저장 기한 -->
</rollingPolicy>
</appender>
</configuration>
클래스에 @Slf4j 어노테이션을 붙이고
log로 로그를 쉽게 찍을 수 있다.
log.info로 info 레벨의 로그를, log.warn로 warn 레벨의 로그를 찍어봤다.
info.txt 로그파일에 info 레벨의 로그가 찍히고
warn.txt에는 warn 레벨의 로그만 들어가있다!
info의 maxFileSize를 넘어설때 파일로 압축하여 저장하고 새로 로그 파일을 작성한다.
다음엔 원하는 로그 파일에 로그를 작성할 수 있도록 해보자.
예를 들어 로그인 로그는 로그인 로그 파일에, 게시글 삭제 로그는 게시글 로그 파일에 작성하도록 해보자~
잘 써둔 블로그 : https://tecoble.techcourse.co.kr/post/2021-08-07-logback-tutorial/, https://ckddn9496.tistory.com/82, https://int-i.github.io/java/2022-10-02/slf4j-logback/