본문 바로가기
SpringBoot

[Spring Boot] 07. Logback 구성하기

by 청양호박이 2019. 11. 12.

지금까지 많지도 않지만 적지도않은 단계를 진행하였습니다. 이제는 Server가 동작하는데 필요한 log가 남겨지도록 구성을 해보겠습니다. 현재는 project내 아무런 log가 남지 않습니다. 비정상적으로 동작하는지... 왜 비정상적으로 동작하는지 알길이 없습니다.

 

Spring Boot에서는 이를 위해서 Logback을 사용합니다. 기존에 Log4j보다 가볍고 기능개선이 되었다고 알려져 있습니다. 이는 SLF4J의 구현체이며, 부트의 기본로그입니다. spring-boot-starter-web의 안에 starter-logging이 포함되어있어 별도의 Maven Repository추가가 필요없습니다.

 

Logback을구성하는 방식은 2가지가 있습니다.

  • application.yml을 통한 설정 
  • logback-spring.xml 생성을 통한 설정

그럼 2가지 방식에 대해서 찬찬히 살펴보겠습니다.

 

 

1. application.yml을 통한 설정


datasource를 설정하는 것처럼 간단한게 application.yml을 통해 설정이 가능합니다. 이는 spring-boot의 기본 구성이 그것을 가능하게 하는데요... 아래의 주소를 통해 이해가 가능합니다.

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base.xml

 

spring-projects/spring-boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>

해당코드는 log의 default file path와 console출력시.... file로 저장시... 에 대한 설정정보들의 기본 설정들이 들어있습니다. 이를 통해 아래의 설정들이 가능하게 되는 것입니다.

 

log파일을 남기는 구조는 File appender의 RollingFileAppender를 사용합니다. 하지만 Spring Boot 1.X만 해도 File의 Rolling (일정파일사이즈를 초과하면 새로운 파일로 작성하는 로직) 이 SizeBasedTriggeringPolicy로 사이즈가 초과할 때만 새로운 log file을 남기는 기능만 지원했었습니다.

 

하지만 Spring Boot 2.X부터는 rolling정책이 SizeAndTimeBaseRollingPolicy로 변경되어 크기가 초과하지 않아도 날짜가 지나갈경우 새로운 로그로 남게 됩니다.  

 

[application.yml]

logging:
  level:
    root: INFO
    com.example.ayoteralab.main: DEBUG
  file:
    path: logs

단지 이렇게만 했는데... project 내 폴더의 logs에 관련 log가 정상적으로 남습니다.

 

 

2. logback-spring.xml 생성을 통한 설정


Spring Boot는 resource내 application.yml파일과 동일레벨로 logback-spring.xml을 생성해서 설정이 가능합니다. 단, logback.xml로 작성을 하게되면, application.yml에 설정한 property변수를 사용할 수가 없습니다. 왜냐하면, spring boot가 구동하면서 바로 동작하기 때문입니다.

 

따라서 logback.xml이 아닌 logback-spring.xml으로 작성함으로써 모든 원하는 부분이 동작 가능하게 됩니다.

 

주요기능은... 

  • appender로 CONSOLE과 FILELOG에 저장이 가능하고
  • 특정 class에 대한 로그레벨의 조작이 가능

[logback-spring.xml]

<?xml version="1.0" encording="UTF-8"?>
<configuration>
	<property name="USER_HOME" value="log" />
	<property name="FILE_NAME" value="logs" />
	
	<appender name="CONSOLE" 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{35} - %msg%n
			</Pattern>
		</layout>
	</appender>
	
	<appender name="FILELOG" class="ch.qos.logback.core.rolling.RollingRileAppender">
		<file>${USER_HOME}/${FILE_NAME}.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${USER_HOME}/Backup/%d{yyyy-MM-dd}/${FILE_NAME}.%i.zip<</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<totalSizeCap>1GB</totalSizeCap>
			<maxHistory>10</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>
				[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n
			</pattern>
		</encoder>
	</appender>
	
	<logger name="com.example.ayotera.main" level="INFO"/>
	
	<root level="INFO">
		<appender-ref ref="CONSOLE"/>
		<appender-ref ref="FILELOG"/>
	</root>
</configuration>

 

 

3. Log 찍는 법


public class UserController {
	
	final Logger L = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	UserService userService;
	
	@ApiOperation(httpMethod = "GET"
			,value = "User 리스트 조회"
			,notes = "Select User List"
			,response = UserDTO.class
			,responseContainer = "ArrayList")
	@RequestMapping(value = "select", method = RequestMethod.GET)
	public ResponseEntity<ArrayList<UserDTO>> selectUser(){
		
		L.info("Select Start");
		
		return ResponseEntity.ok(userService.selectUser());
	}

}

final Logger L = LoggerFactory.getLogger(this.getClass()); 를 추가하고, L.info( ); 처럼 찍어주면 아래와 같이 log 파일에 남게 됩니다.

 

이렇게 log를 남기는 것도 완성했습니다. logback은 간단하게 이렇게 마무리 하겠습니다.

 

-Ayotera Lab-

댓글