본문 바로가기
코딩일기/날씨앱 만들기 프로젝트

[Spring Boot] log 파일 남기는 법

by 욱파이어니어 2022. 1. 26.
728x90
반응형

우리가 프로젝트를 진행하다보면 가장 중요한 부분이 log이다.

이전에 이클립스를 사용했을땐 System.out.println()을 통하여서 진행상황을 체크하곤 했는데 

해당 방식은 성능도 떨어질 뿐더러 프로젝트의 속도도 느려지게한다.

 

 

따라서 우리가 진행상황 체크를 위해서 사용하는것이 log4j와 logback이다.

 

 

Spring boot는 기본적으로 spring-boot-starter-web 에 다 포함 되어 있기 때문에 따로 dependency를 따로 추가해주지 않아도 된다.

 

 

그럼 이제 logback에 대해서 좀 더 자세히 알아보자.

 

 

우릭 남기는 로그에는 아래와 같은 레벨이 존재한다.

 

 

Error > Warn > Info > Debug > Trace

 

Error의 로그 레벨이 제일 높고 Trace의 레벨은 제일 낮다.

 

우리는 위의 레벨들을 아래와같이 출력을 할수가 있다.

 

private Logger logger = (Logger) LoggerFactory.getLogger(ShortWeatherController.class);

logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");

 

위 명령어들을 입력을 하면 콘솔창에 로그가 찍히는것을 볼수가 있다.

 

 

 

그럼 이제 Logger 클래스를 이용하여서 log를 찍을수 있으니 Logback의 설정을 설정하는 로그파일에 대해서 알아보자.

 

 

 

로그파일은 우리가 로그의 형식을 따로 지정해줄수 있도록 하는 설정 파일이다.

 

로그파일 같은 경우는 /resource 폴더 안에 위치하고 로그파일의 이름은

spring 같은 경우 logback-spring.xml 로 설정을 한다.

 

logback 파일을 만들었으면 아래와 같이 configuration 명령어를 입력해 설정을 시작해보자.

 

<configuration scan="true" scanPeriod="30 second">
</configuration>

위 코드의 뜻은 로그를 스캔하게하고 로그 스캔 주기는 30초로 설정한다는 뜻이다.

 

그럼 이제 로그를 어떻게 출력할지 로그 출력 방식을 우리가 지정해보자.

 

 

	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<!-- 콘솔에 찍을것이다 -->
		<!-- 어떤걸 콘솔에 찍을거냐면 log의 레벨이 info인 애들만 log를 콘솔에 출력시킬것이다. -->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
		<!-- 출력의 방식은 아래와 같다. -->
		<encoder>
			<!-- [시간][로그레벨][thread이름] logger이름 메시지 \n 의 형식으로 출력 -->
			<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
		</encoder>
	</appender>

 

<appender> 는 로그의 형태 및 로그를 어디에 출력할지 설정하는곳이다.

나같은경우는 일단 콘솔에 출력하는 형태를 지정할것이기 때문에 ConsoleAppender 로 설정했다 

name은 appender의 변수명을 지정하는곳이다.

 

그리고 나는 <filter> 를 넣어서 모든 레벨의 로그를 콘솔에 찍지 않고 INFO 레벨 이상의 레벨만 콘솔에 찍기 위해 위와 같이 코드를 입력 했다.

 

그리고 <encoder>를 통해서 로그를 어떻게 출력할지 지정했다.

 

%d 는 로그 기록시간이고 형태는 yyyy-MM-dd  HH : mm : ss.SSS로 년-월-일 시:분:초.밀리초 로 출력하기로 했고

[%-5level] 로 해당 로그 레벨을 출력하고 

[%thread] 를 통해서 현재 Thread 명을 찍고

%logger 를 통해서  logger 네임을 출력하고 

%msg 를 통해서 로그 메시지를 출력하고 

%n 을 통해서 개행을 주었다.

 

 

그럼 아래와 같은 로그가 찍히게 된다.

 

[2022-01-26 16:28:58:651] [INFO ] [http-nio-8090-exec-9] com.wook.controller.ShortWeatherController Success

 

 

그리고 나는 로그를 콘솔 뿐만 아리나 파일로도 로그를 저장하고 싶어 아래와 같이 <appender> 를 또 만들었다.

 

	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>./logs/application.log</file>
		<encoder>
			<pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>application.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
			<maxHistory>2</maxHistory>
			<totalSizeCap>15MB</totalSizeCap>
		</rollingPolicy>
	</appender>

나는 <appender>를 RollingFileAppender를 통해 여러개의 파일을 순회하며 로그를 저장하도록 했다.

 

<file>을 통해서 로그 파일이 저장될 디렉토리와 파일명을 정해두었고

<encoder> 를 통해서 출력되는 형식을 지정하였다.

 

그리고 제일 중요한 

<rollingPolicy> 를 통해서 어떻게 로그 파일들을 저장할지 설정을 해두었다.

일단 일자별로 파일이 저장되는 패턴은 

<fileNamePattern> 을 통해서 지정해두었고

<maxHistory> 를 통해서 2일 이상 가지고 있지 않기로 하였고

<totalSizeCap> 을 통해서 로그파일의 최대 크기를 15MB로 설정 하였다.

 

 

 

그래서 일단 내 전체적인 로그파일은 아래와 같다.

 

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 second">
<!-- 30초마다 로그에 변경이 있는지 체크하는것 -->

	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<!-- 콘솔에 찍을것이다 -->
		<!-- 어떤걸 콘솔에 찍을거냐면 log의 레벨이 info인 애들만 log를 콘솔에 출력시킬것이다. -->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
		<!-- 출력의 방식은 아래와 같다. -->
		<encoder>
			<!-- [시간][로그레벨][thread이름] logger이름 메시지 \n 의 형식으로 출력 -->
			<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
		</encoder>
	</appender>
	
	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>./logs/application.log</file>
		<encoder>
			<pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>application.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
			<maxHistory>2</maxHistory>
			<totalSizeCap>15MB</totalSizeCap>
		</rollingPolicy>
	</appender>
	
	<root level="INFO">
		<!-- INFO단계 위로 모두 아래의 console 방식으로 출력하는것임 -->
		<appender-ref ref="console"/>
		<appender-ref ref="file"/>
	</root>

</configuration>
반응형