로메오의 블로그

[Spring Boot] Logback 설정하기 본문

Backend/Spring

[Spring Boot] Logback 설정하기

romeoh 2019. 8. 23. 23:48
반응형

Spring Boot / Oracle / Mybatis 차례

 

Spring Boot는 logback이 기본으로 설정되어 있어서 별도로 라이브러리를 추가하지 않아도 됩니다.

spring-boot-starter-web 안에 spring-boot-starter-logging 구현체가 있습니다.

만약 Spring Boot가 아니라면 maven에서 logback 모듈을 추가해줘야 합니다.

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    <scope>test</scope>
</dependency>

이전 포스트에서 생성한 프로젝트에서 log를 찍어보겠습니다.

 

PersonController.java

package controller;

import java.util.Hashtable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import service.PersonService;
import model.Person;

@CrossOrigin
@RestController
@RequestMapping("/persons")
public class PersonController {
	
	@Autowired
	PersonService personService;
	
	@RequestMapping("/all")
	public Hashtable<String, Person> getAll() {
		Logger logger = LoggerFactory.getLogger(PersonController.class);
		
		logger.trace("trace -- Hello world.");
		logger.debug("debug -- Hello world.");
		logger.info("info -- Hello world.");
		logger.warn("warn -- Hello world.");
		logger.error("error -- Hello world.");
		
		return personService.getAll();
	}
	
	@RequestMapping("{id}")
	public Person getPerson(@PathVariable("id") String id) {
		return personService.getPerson(id);
	}
}

서버를 구동합니다.

 

Console에서 서버 구동상태를 확인합니다.

브라우저에서 http://localhost:8088/persons/all 에 접속합니다.

 

Controller에서 찍은 로그가 표시됩니다.

반응형

src/main/resources/application.properties

logging.level.root=warn

application.properties에 위 코드를 추가하고 서버를 재구동합니다.

console에 info 로그가 찍히지 않습니다.

페이지를 새로고침하면 info 로그는 찍히지 않고 warn이상의 로그만 찍힙니다.

 

로그레벨의 순서는 아래와 같습니다.

TRACE > DEBUG > INFO > WARN > ERROR

- TRACE : 추적 레벨은 Debug보다 좀더 상세한 정보를 나타냅니다.
- DEBUG : 프로그램을 디버깅하기 위한 정보를 표시합니다. (운영서버에서는 표시하지 않도록 설정함)
- INFO  : 상태변경과 같은 정보성 로그를 표시합니다.
- WARN  : 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄 
- ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시합니다.


Logback 설정 파일

resources폴더에서 New > Other를 선택합니다.

XML > XML File을 선택합니다.

logback-spring.xml을 생성합니다.

 

logback-spring.xml

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

    <!--로그 파일 저장 위치-->
    <property name="LOGS_PATH" value="./logs"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>
    <appender name="SAMPLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS_PATH}/logback.log</file>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <maxFileSize>5MB</maxFileSize>
                <!-- kb, mb, gb -->
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>
    
    <logger name="com.gaeyou.firstproject" level="DEBUG">
        <appender-ref ref="SAMPLE" />
    </logger>
    <logger name="com.gaeyou.firstproject" level="INFO">
        <appender-ref ref="DAILY_ROLLING_FILE_APPENDER" />
    </logger>
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

Logback-spring.xml은 appender와 logger 크게 두개로 구분됩니다.

appender는 log의 형태를 설정하고

logger는 설정한 appender를 참조하여 package와 level을 설정합니다.

 

<property>

설정파일에서 사용될 변수값

 

<appender class="">

 

appender의 class의 종류는 아래와 같습니다.

 

ch.qos.logback.core.ConsoleAppender : 콘솔에 로그를 찍음

ch.qos.logback.core.FileAppender : 파일에 로그를 찍음

ch.qos.logback.core.rolling.RollingFileAppender : 여러개의 파일을 순회하면서 로그를 찍음

ch.qos.logback.classic.net.SMTPAppender : 로그를 메일에 찍어 보냄

ch.qos.logback.classic.db.DBAppender : 데이터베이스에 로그를 찍음

 

<layout> 과 <encoder>

encoder는 layout보다 제어할수 있는 범위가 넓습니다. 

encoder는 시간과 내용을 완전히 제어 할수 있지만 layout은 이벤트 등의 제어에 한계가 있습니다.

 

<pattern>

[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n
[2019-08-23 22:59:47:1306][main] INFO  c.g.f.FirstProjectApplication - Started FirstProjectApplication in 1.193 seconds (JVM running for 1.665)

%d  => 로그 기록시간

%thread => 현재 Thread 이름

%-5level => 로그 레벨, -5는 출력의 고정폭 (5글자)

%logger{35} => 축약된 logger name, 35는 최대 자릿수

%msg => 로그메시지

%n => 줄바꿈

 

기타

${PID:-} => 프로세스 아이디

%p => 로깅 레벨

%F => 로깅이 발생한 프로그램 파일명

%M => 로깅일 발생한 메소드의 이름

%l => 로깅이 발생한 호출지의 정보

%L => 로깅이 발생한 호출지의 라인 수

%t => 쓰레드 명

%c => 로깅이 발생한 카테고리

%C => 로깅이 발생한 클래스 명

%m => 로그 메시지

%r => 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간

 

<file>

기록할 파일명과 경로를 설정합니다.

<rollingPolicy class>

ch.qos.logback.core.rolling.TimeBasedRollingPolicy => 일자별 적용

ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP => 일자별 + 크기별 적용

 

<fileNamePattern>

파일 쓰기가 종료된 log 파일명의 패턴을 지정합니다.

.gz나 .zip으로 자동으로 압축할 수도 있습니다.

 

<maxFileSize>

최대 파일 용량 (최대 10MB 내외 권장)

 

<maxHistory>

최대 파일 생성 갯수 (

 

<root> 와 <logger>

root는 logger와 같고, 최상위 패키지에 기본적으로 적용한다.

 

 

서버를 구동해서 확인 해봅니다.

ConsoleAppener는 SAMPLE과 STDOUT 두가지를 정의 했습니다.

encoder로 적용한 SAMPLE logger는 [YYYY_MM_DD ...] 형태로 로그가 찍히는것을 알 수 있습니다.

STDOUT은 layout으로 찍어서 시간만 표시되는 두가지 형태의 로그가 console에 찍혔습니다.

 

RollingFileAppender로 찍힌 DAILY_ROLLING_FILE_APPENDER 어펀더는 지정된 경로에 파일이 생성한 것을 알 수 있습니다.

파일을 열어보면 로그를 확인 할 수 있습니다.

 

gz로 압축된 log도 생성되는것을 확인 할 수 있습니다.

 

Spring Boot / Oracle / Mybatis 차례

반응형
Comments