본문 바로가기
프로그래밍/Java

logback 설정하기 (properties 를 통한 외부설정)

by 동네로봇 2019. 11. 13.

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 레벨 이상만 기록되는 걸 확인할 수 있다!