Back-end/Springboot

[SpringBoot] 로그백(Logback)

ljs981026 2023. 5. 4. 10:59

1. 로깅(logging)

애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것을 의미한다.

 

2. Logback

log4j 이후에 출시된 로깅 프레임워크로서 slf4j를 기반으로 구현됐으며, 과거에 사용되던 log4j에 비해 월등한 성능을 자랑한다. 또한 스프링 부트의 spring-boot-starter-web 라이브러리 내부에 내장돼 있어 별도의 의존성을 추가하지 않아도 사용할 수 있다.

 

3. Logback 특징

  • 5개의 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR)을 설정할 수 있다.
    • ERROR: 로직 수행 중에 시스템에 심각한 문제가 발생해서 애플리케이션의 작동이 불가능한 경우
    • WARN: 시스템 에러의 원인이 될 수 있는 경고 레벨
    • INFO: 애플리케이션의 상태 변경과 같은 정보 전달을 위해 사용
    • DEBUG: 애플리케이션의 디버깅을 위한 메시지를 표시하는 레벨
    • TRACE: DEBUG 레벨보다 더 상세한 메시지를 표현하기 위한 레벨
  • 실제 운영 환경과 개발 환경에서 각각 다른 출력 레벨을 설정해서 로그를 확인
  • Logback의 설정 파일을 일정 시간마다 스캔해서 애플리케이션을 재가동하지 않아도 설정 변경 가능
  • 별도의 프로그램 지원 없이도 자체적으로 로그 파일 압축 가능
  • 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리 가능

4. Logback 설정

    4-1. Logback 설정 코드 작성

     설정 파일은 일반적으로 클래스패스에 있는 설정 파일을 자동으로 참조하기 때문에 리소스 폴더 안에 생성한다. 파일         명은 일반적인 자바 또는 스프링 프로젝트에서는 logback.xml이라는 이름으로 참조하지만 스프링 부트에서는                     logback- spring.xml 파일을 참조한다.

// src/main/resources/logback-spirng.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <property name="LOG_PATH" value="./logs" />

    <!-- Appenders -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <file>${LOG_PATH}/info.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/info_${type}.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <!--TRACE > DEBUG > INFO > WARN > ERROR > OFF -->
    <!-- Root Logger -->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="INFO_LOG" />
    </root>
</configuration>
  • Apeender 영역: 로그의 형태를 설정하고 어떤 방법으로 출력할지 설정, 아래는 대표적인 구현체 5가지이다.
    • ConsoleAppender: 콘솔에 로그를 출력
    • FileAppender: 파일에 로그를 저장
    • RollingFileAppender: 여러 개의 파일을 순회하면서 로그를 저장
    • SMTPAppender: 메일로 로그를 전송
    • DBAppender: 데이터베이스에 로그를 저장
  • filter 요소: 각 Appender가 어떤 레벨로 로그를 기록하는지 지정
  • encoder 요소: 로그의 표현 형식을 패턴(pattern)으로 정의
패턴 의미
%Logger{length} 로거의 이름
%-5level 로그 레벨. -5는 출력 고정폭의 값
%msg(%message) 로그 메시지
%d 로그 기록 시간
%p 로깅 레벨
%F 로깅이 발생한 애플리케이션 파일명
%M 로깅이 발생한 메서드 이름
%I 로깅이 발생한 호출자의 정보
%thread 현재 스레드명
%t 로깅이 발생한 스레드명
%c 로깅이 발생한 카테고리
%C 로깅이 발생한 클래스명
%m 로그 메시지
%n 줄 바꿈
%r 애플리케이션 실행 후 로깅이 발생한 시점까지의 시간
%L 로깅이 발생한 호출 지점의 라인 수
  • Root 영역: 설정 파일에 정의된 Appender를 활용하기 위해 Root 영역에서 Appender를 참조해서 로깅 레벨을 정해준다.

    4-2. Logback 적용

     GetController에 Logger를 적용해보자. Logback은 출력할 메시지를 Appender에게 전달할 Logger 객체를 각 클래스에       정의해서 사용한다. 

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
    private final Logger LOGGER = LoggerFactory.getLogger(GetController.class);
 	...
    // http://localhost:8080/api/v1/get-api/hello
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String getHello() {
        LOGGER.info("getHello 메서드가 호출되었습니다.");
        return "Hello World";
    }
    // http://localhost:8080/api/v1/get-api/name
    @GetMapping(value = "/name")
    public String getName() {
        LOGGER.info("getName 메서드가 호출되었습니다.");
        return "Flature";
    }
    // http://localhost:8080/api/v1/get-api/variable1/{String 값}
    @GetMapping(value = "/variable1/{variable}")
    public String getVariable(@PathVariable String variable) {
        LOGGER.info("@PathVariable을 통해 들어온 값 : {}", variable);
        return variable;
    }
	...
}

 

    4-2. Logback 출력

     아래와 같이 Logback을 적용해준 메서드가 호출될 때 메시지가 호출되는 것을 알 수 있다.

log 출력 결과

 

 

 

 

 

참고 문헌: 스프링 부트 핵심 가이드(스프링 부트를 활용한 애플리케이션 개발 실무)

http://www.yes24.com/Product/Goods/110142898

 

스프링 부트 핵심 가이드 - YES24

입문자의 눈높이에 맞춰 차근차근 따라 하면서 배우는 스프링 부트 입문서!《스프링 부트 핵심 가이드》는 스프링 부트 기반의 애플리케이션을 개발할 때 필요한 기초적인 내용들을 소개하고,

www.yes24.com