스프링부트 로그 찍는 법, 로그 파일 만드는 방법
스프링부트는 Logback을 기본으로 쓰며 log.debug()로 개발자가 직접 로그를 찍을 때는 @Slf4j 추상 라이브러리를 사용한다.
Logback을 쓰든 Log4j를 쓰든 공통적으로 로그를 찍는 라이브러리는 콘솔 출력 형태 커스터마이징 할 수 있고 콘솔 출력 내용을 파일로 내려받을 수 있다.
@Slf4j
Slf4j는 로깅의 추상화된 로그 라이브러리다.
이 말은 추후에 로그 라이브러리(스프링부트면 Logback에서 Log4j2로)를 다른 것으로 대체하더라도 기능의 문제가 없다는 장점이 존재한다.
@Slf4j에서 log.debug()와 같은 기능을 이용하기 위해서는 아래와 같이 사용할 수 있다.
@Slf4j는 Lombok의 기능이지만 Lombok을 이용하지 않는다면 아래와 같이 사용한다.
public class Slf4jSample {
private static final Logger log = LoggerFactory.getLogger(Slf4jSample.class);
public static void main(String[] args) {
log.info("---------- Log 테스트 ---------");
}
}
@Slf4j를 사용하면 아래와 같이 사용할 수 있다.
@Slf4j
public class Slf4jSample {
public static void main(String[] args) {
log.info("---------- Log 테스트 ---------");
}
}
@Slf4j를 사용하면 변수명이 log로 고정된다는 특징과 아래의 {}를 값을 대입하는 용도로 쓸 수 있다는 장점도 존재한다.
log.info("1번의 값은 : "+value1 + " 2번의 값은 : "+value2);
log.info("1번의 값은 : {} 2번의 값은 : {}", value1, value2);
log4j
콘솔로 출력하는 stdout 외에도 파일 출력도 제공한다.
하지만 2015년에 개발이 중단되었기 때문에 기존 시스템이 아니라면 사용할 이유가 없다.
logback
log4j2 전에 개발된 로깅프로그램으로 log4j에서 향상된 성능과 필터링 옵션을 제공한다.
slf4j도 지원한다. 그리고 자동 리로드도 가능하다.
자동 리로드는 무슨 말이냐면 logback 설정 변경 시 서버 재시작이 필요없다는 뜻이다.
스프링부트의 기본 로깅 라이브러리며 spring-boot-starter-web에 포함되어있다.
log4j2
logback과 동일하게 자동 리로드 기능과 필터링 기능을 제공한다.
Apache에 따르면 logback과 차이점은 log4j2가 멀티 쓰레드 환경에서 비동기 로거(Async Logger)의 경우 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다고 한다.
더불어 람다 표현식과 사용자 정의 로그 레벨도 지원한다.
logback 로그 파일 만들기
logback-spring.xml 파일을 만들어서 아래의 내용을 넣어준다.
그럼 로그 파일이 C:/LOGS/MyApp/logs에 담기는 것을 확인할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds"> <!-- 1분 마다 변경 이력 감지(적어주지 않아도 Default) -->
<!-- 로그 파일이 저장될 경로 -->
<property name="LOG_PATH" value="/LOGS/MyApp/logs"/>
<!-- 로그 파일 이름 -->
<property name="LOG_FILE_NAME" value="MyAppLog"/>
<!-- 로그 출력 패턴 -->
<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
<!-- 로그 레벨 -->
<!--
1) ERROR : 오류 메시지 표시
2) WARN : 경고성 메시지 표시
3) INFO : 정보성 메시지 표시
4) DEBUG : 디버깅하기 위한 메시지 표시
5) TRACE : Debug보다 훨씬 상세한 메시지 표시
아래에서는 info로 설정하였는데, 이 경우엔 INFO 보다 위에 있는 DEBUG와 TRACE는 표시하지 않는다.
-->
<property name="LOG_LEVEL" value="info"/>
<!-- CONSOLE에 로그 출력 세팅 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} : %30logger{5} - %msg%n
</Pattern>
</layout>
</appender>
<!-- File에 로그 출력 세팅 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 파일 경로 설정 -->
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<!-- 출력패턴 설정-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일당 최고 용량 kb, mb, gb -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
<maxHistory>30</maxHistory>
<!--<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>-->
</rollingPolicy>
</appender>
<!-- 로그 전역 세팅 -->
<root level="${LOG_LEVEL}">
<!-- 위에 설정한 콘솔 설정 추가 -->
<appender-ref ref="CONSOLE"/>
<!-- 위에 설정한 파일 설정 추가 -->
<appender-ref ref="FILE"/>
</root>
</configuration>