spring boot 로 로그를 남겨보자
일반적으로 logback-spring.xml 을 통해 일부 설정을 하드 코딩해도 되지만,
배포 환경에 따라 다른 값을 적용할 수 있기 때문에 properties 파일을 만들어 외부로 설정을 빼기로 했다.
1. logback dependency 추가하기
spring boot의 경우 logback 기본설정을 제공하기 때문에 spring-boot-starter-web 을 maven pom에 설정해주면 자동으로 logback 기능을 사용할 수 있다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
일반 spring 이라면 아래 dependency를 추가한다.
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
2. logback-spring.xml 파일 생성하기
일반 스프링의 경우에는 logback.xml 파일을 통해 설정을 하지만, 스프링 부트의 경우 이미 logback.xml 파일로 로그 디폴트 값이 설정이 되어 있기 때문에 커스터마이징을 위해서는 logback-spring.xml 이름으로 파일을 만들어야 한다. 위치는 src - main - resources 밑에 두면 된다.
3. xml 설정하기
이제 어떤 로그 레벨에서 기록을 남길 것인지, 어떤 위치에 파일을 저장할 것인지, 어떤 정보를 기록할 것인지를 설정한다.
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 외부 설정 파일을 사용할 수 있다. -->
<property resource="logback.properties" />
<property name="LOG_LEVEL" value="${log.level}" />
<property name="LOG_PATTERN" value="${log.pattern}" />
<property name="LOG_PATH" value="${log.FILE.path}" />
<property name="LOG_FILE" value="${log.FILE.filename}" />
<property name="LOG_FILE_MAX_SIZE" value="${log.maxFileSize}" />
<property name="LOG_FILE_MAX_HISTORY" value="${log.maxHistory}" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- filenamepatter을 설정하려고 하지 않는 경우 아래 설정이 기본으로 설정됨. -->
<!-- <file>src/logs/application.log</file> -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Daily rollover with compression -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE}.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 30 days worth of history -->
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 특정 클래스에서 해당 레벨 기록하고 싶은 경우 -->
<logger name="com.example.controller">
<level value="info" />
</logger>
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
일부 설정은 변경될 수 있으므로, logback.properties 파일을 생성하여 외부 참조를 하였다. 이렇게 하지 않고 그냥 직접 값을 넣어줘도 된다.
logback.properties
log.level=debug
log.pattern=%date{yyyy-MM-dd HH:mm:ss.SSSS ZZZZ} - [%level] - from %logger in %thread %message%n%xException
log.FILE.path=src/logs
log.FILE.filename=application.%d{yyyy-MM-dd}.%i
log.maxFileSize=10MB
log.maxHistory=30
appender console 을 통해서 콘솔에 출력할 내용을, appender file 태그로 file로 저장할 내용을 설정하였다.
파일을 생성할 때 날짜별로 파일 이름을 구분하고 싶어 <fileNamePattern> 태그를 추가하였다.
<fileNamePattern> 태그가 있더라도 <file> 태그가 있다면 <file>이 그대로 적용됨.
<root>를 통해서 file과 console에 로그를 출력할 때 debug 레벨 이상의 정보만 기록하도록 하였다.
하지만 com.example.controller 패키지에서는 <logger>로 인해 info 레벨 이상일 때만 출력된다.
4. logging 코드를 클래스에 추가하기
마지막 단계! 설정을 끝냈다면 이제 클래스에서 테스트 해보자.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LogTest {
private static final Logger log = LoggerFactory.getLogger(LogTest.class);
@RequestMapping("/log")
public String logExam() {
log.trace("#ex1 - trace log");
log.debug("#ex1 - debug log");
log.info("#ex1 - info log");
log.warn("#ex1 - warn log");
log.error("#ex1 - error log");
return "콘솔 또는 파일경로 확인";
}
}
입력한대로 debug 레벨 이상만 기록되는 걸 확인할 수 있다!
'프로그래밍 > Java' 카테고리의 다른 글
[java] request.getParameter 의 Content-Type (0) | 2020.03.29 |
---|---|
AOP로 세션 확인하기 - @Around 어노테이션, 메서드 리턴 값과 일치시키기 (0) | 2019.11.20 |
Spring Boot로 Json 데이터 처리하기 (@ResponseBody, @RequestBody 어노테이션) (1) | 2019.11.03 |