Springboot LogBack 설정하기

조성권·2021년 12월 28일
0
post-thumbnail

오늘은 logback을 SpringBoot에서 설정하는 방법을 알아보도록 하겠다.

1. 개요

logback은 기존 Spring MVC에서 로그를 남길 때 사용되던 log4j의 후속 로그 라이브러리라고 할 수 있다.

이들은 이름은 미묘하게 다르지만 결국 하는 일은 시스템의 로그를 남기는 것이다.
로그를 남기는 경우는 버그가 발생한 경우, 단순 모니터링, 과거 히스토리 확인 등 다양한 케이스가 존재한다.

2. logback의 장점

앞서 언급한 것처럼 logback은 log4j의 후속 라이브러리이다.
log4j보다 늦게 나온만큼 기존 log4j보다 기능 추가 및 성능 향상이 이뤄졌다고 볼 수 있다.

  1. SLF4J 구현
    logback의 Logger 클래스는 SLF4J의 API 스펙을 구현하기 때문에 SLF4J의 API를 그대로 사용할 수 있다는 장점이 있다.
    이는 마치 JDBC AP 사용 시, 어떤 DBMS의 JDBC Driver(MySQL, Maria DB, Oracle 등)를 사용하든 코드에 변경이 없는 것돠 동일한다.

  2. 광범위한 레퍼런스
    logback는 세부적인 가이드 문서를 제공하며 지속적인 업데이트가 되고 있다.
    지속적인 업데이트가 되고 있다는 것은 그만큼 보안성을 보장한다는 것을 의미한다고 볼 수 있다.

  3. XML과 Groovy 설정 지원
    기존 XML 설정 뿐만 아니라 Groovy를 통해 설정이 가능하다.
    Groovy를 잘 다룰 줄 아는 개발자라면 XML 설정할 때보다 코드를 간결하고 이해하기 쉽게 짤 수 있다.

3. 구현

이제 직접 logback을 구현해볼 차례이다.

3-1. Spring Initializr

먼저 위와 같이 Spring Initialzr에서 SpringBoot 프로젝트를 생성한다.
Dependency는 Spring Web만 주입하면 충분하다.

Spring Initialzr 링크
https://start.spring.io

3-2. Logger 클래스 생성 및 사용

이제 사용해볼 차례이다.

Tree구조는 다음과 같다.
다른 것은 모두 기본 세팅과 동일하며 기존 package에서 controller패키지 생성, LogController 클래스 생성한 것이 전부이다.

소스 코드는 아래와 같다.

package com.example.logbackStudy.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class LogController {
	
	
	@RequestMapping(value="/index")
	public String index() {
		Logger logger = LoggerFactory.getLogger(this.getClass());
		logger.info("hello");
		logger.info("This is logger");
		
		return "hello";
	}

}

위와 같이 사용하고 localhost:8080/index를 접근해보도록 하자.
.
.
.
접근하고 console창을 보면 다음과 같다.

맨 하단에 본인이 info로 기재했던 로그가 보인다면 여기까지 잘 따라왔다고 볼 수 있다.


사실 우리는 아무것도 하지 않았지만 Logger 클래스를 사용해서 로깅을 할 수 있었다.

그 이유는 우리가 처음 Dependency로 주입했던 Spring Web starter 패키지를 통해 이미 logback 관련 라이브러리가 이미 추가되었기 때문이다.

하지만, 개인적인 토이 프로젝트라면 이렇게 사용하면 그만이겠지만 그게 아니라면 우리는 추가적으로 설정이 필요하다.

여기서 추가적인 설정이란 log 내용을 단순 Console만이 아닌 파일에 담기 위한 설정, 어느 level의 log 내용까지만 출력할 것인지 등에 관한 내용이라 할 수 있다.

이제 다시 시작해보도록 하자.

3-3. logback.xml 생성

resources 하위에 logback 설정파일을 생성하도록 하자.
저자같은 경우, logback이라느 폴더를 하나 추가 생성 후, 그 하위에 logback-local.xml을 생성했다.

파일을 생성했다면 아래 코드를 적용해보자.

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

	<!-- 로그파일 저장 경로 -->
	<property name="LOG_DIR" value="/Users/skcho/logback" />

	<!-- 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>
	<!-- // CONSOLE -->
	<!-- SYSLOG -->
	<appender name="SYSLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/syslog/syslog.log</file>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>
				[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} : %30logger{5} - %msg%n
			</Pattern>
		</layout>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_DIR}/syslog/syslog.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>
	<!-- // SYSLOG -->
	<!-- ACCESSLOG -->
	<appender name="ACCESSLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/accesslog/accesslog.log</file>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>
				%msg%n
			</Pattern>
		</layout>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_DIR}/accesslog/accesslog.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>
	<!-- // ACCESSLOG -->
	
	<root level="info">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="SYSLOG" />
	</root>
	<logger name="com.example.logbackStudy" level="debug" additivity="false">
		<appender-ref ref="CONSOLE" />
	</logger>
	<logger name="access-log" level="info" additivity="false">
		<appender-ref ref="ACCESSLOG" />
	</logger>
	
	
</configuration>
  • LOG_DIR property: 로그 파일이 저장될 base 경로
  • 사용한 appender class:
  1. ch.qos.logback.core.ConsoleAppender: console에 로그를 찍기위해 사용
  2. ch.qos.logback.core.rolling.RollingFileAppender: 여러개의 파일을 순회하면서 로그를 찍기 위하여 사용
  • appender 태그와 logger 태그 차이: appender는 log의 형태를 설정한다고 보면 되고 logger는 appender를 통해 적용할 package와 log level을 설정하는 부분이라 볼 수 있다.

그 외에 pattern, file 등의 태그에 대한 얘기와 더 원론적인 얘기로 들어가면 log level까지 이야기해야겠지만 다른 블로그에 이해하기 쉽게 적힌 내용이 많기 때문에 추가적으로 여기서 다루진 않겠다.

  • log 저장 폴더 만들기
    저자는 위에서 LOG_DIR으로 /Users/skcho/logback를 지정했다.
    그렇기 때문에 해당 경로가 실제 존재하도록 /Users/skcho 경로 하위에 logback이라는 폴더를 만들어줬다.

4. application.properties 수정

SpringBoot의 application.properties는 xml or gradle 형태로 사용할 수 있지만 저자는 xml을 사용했기 때문에 xml 기준으로 추가 기입할 내용을 적어보도록 하겠다.

logging.config=classpath:logback/logback-local.xml

처음 들어가면 아무것도 기재되어 있지 않을텐데 위와 같이 한줄만 추가해주면 된다.
기본적으로 classpath는 src/main/resources까지 잡혀있기 때문에 그 하위부터 경로를 추가 기재해주면 된다.

5. 실행

  • logback 설정파일 만들기
  • application.properties에 설정 파일 경로 잡아주기
  • LOG_DIR로 설정한 해당 경로에 폴더 만들어주기

위 3가지를 모두 했다면 이제 정상적으로 돌아갈 일만 남았다.
실행해보도록 하자.
.
.
.
.
.
.
이제 실행해본 후, 본인이 LOG_DIR로 설정한 경로로 들어가보도록 하자.
원래 해당 경로까지만 폴더를 생성하고 하위에는 폴더나 파일을 생성하지 않았는데 아래와 같이 생성되어 있는 것을 볼 수 있다.

여기서 syslog경로로 들어가서 해당 파일을 들여다보면 현재까지의 info level 이상의 모든 로그가 저장되어 있는 것을 확인할 수 있을 것이다.

전체 소스 git 링크
https://github.com/cho876/Study/tree/master/logbackStudy

profile
천천히, 완벽히 배워나가고자 하는 웹 서비스 엔지니어

0개의 댓글