Book/스프링부트 핵심가이드

로깅 라이브러리 - Logback

블로그 주인장 2023. 10. 26.

로그를 등록하는 라이브러리인 Logback에 대해서 알아보겠습니다.


로깅(logging)

  • 애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것을 의미한다.
  • 개발 영역 중 '비기능 요구사항' 에 속한다. (사용자나 고객에게 필요한 기능은 아니라는 의미)
  • 디버깅하거나 개발 이후 발생한 문제를 해결할 때, 원인을 분석하는 데 꼭 필요한 요소이다.

Logback

  • 자바 진영에서 가장 많이 사용되는 로깅 프레임워크는 'logback' 입니다.
  • log4j 이후에 출시된 로깅프레임워크로써 slf4j를 기반으로 구현되었으며 과거에 사용되던 log4j에 비해 월등한 성능을 자랑한다.
  • 스프링부트의 spring-boot-starter-web 라이브러리 내부에 내장되어있어 별도의 의존성을 추가화지 않아도 사용 가능하다.

Logback의 특징

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

Logback의 설정

일반적으로 클래스패스(classPath)에 있는 설정 파일을 자동으로 참조하므로

Logback 설정 파일은 리소스 폴더 안에서 생성한다.

파일명의 경우 일반적인 자바 또는 스프링 프로젝트에서는 logback.xml 이라는 이름으로 참조하지만,

스프링 부트에서는 logback-spring.xml 파일을 참조한다.

Logback 설정 파일 예시

Appender 영역

로그의 형태를 설정하고, 어떤 방법으로 출력할지를 설정하는 곳이다.

Append 자체는 하나의 인터페이스를 의미하여, 하위에 여러 구현체가 존재한다.

https://logback.qos.ch/manual/appenders.html

  1. ConsoleAppender : 콘솔에 로그 출력
  2. FileAppender : 파일에 로그 저장
  3. RollingFileAppender : 여러 개의 파일을 순회하면서 로그 저장
  4. SMTPAppender : 메일로 로그 전송
  5. DBAppender : 데이터베이스에 로그 저장

Encoder 영역

로그 표현 형식을 패턴(pattern)으로 정의한다.

패턴 의미
%Logger{length} 로거의 이름
%-5level 로그레벨, -5는 출력 고정폭의 값
%msg(%message) 로그 메시지
%d 로그 기록 시간
%p 로깅 레벨
%thread 현재 스레드명
%F 로깅이 발생한 애플리케이션 파일명
%M 로깅이 발생한 메서드 이름
%I 로깅이 발생한 호출지의 정보

Root 영역

Appender를 활용하려면 Root 영역에서 Appender를 참조해서 로깅 레벨을 설정한다.

특정 패키지에 대해 다른 로깅 레벨을 설정하고 싶다면 root 대신에 logger를 사용하여 지정한다.

<!-- Root  -->
<root level="INFO">
    <appender-ref ref="console"/>
    <appender-ref ref="INFO_LOG"/>
</root>

<!-- Logger -->
<logger name = "com.spring.api.controller" level="DEBUG" additivity="false">
    <appender-ref ref="console"/>
    <appender-ref ref="INFO_LOG"/>
</logger>

logger 요소

  • name  : 패키지 단위로 로깅이 적용될 범위를 지정
  • level : 로그 레벨을 지정
  • additivity : 앞에서 지정한 패키지 범위에 하위 패키지 포함 여부 결정(기본값 : true, 이 경우 하위 패키지를 모두 포함)

Logback의 적용

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {

    private final Logger logger = LoggerFactory.getLogger(GetController.class);
    
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String getHello() {
        logger.info("getHello 메서드가 호출되었습니다.");
        return "Hello World";
    }    
}

Logback Test

Swagger 테스트
console 로그 출력

Logback 컨트롤러에 들어오는 값 확인

  1. [+] 연산자
  2. String 클래스의 concat() 메서드 활용
  3. String 클래스의 append() 메서드 활용
  4. String 클래스의 format() 메서드 활용
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {

    private final Logger logger = LoggerFactory.getLogger(GetController.class);
    
    @GetMapping(value = "/variable1/{variable}")
    public String getVariable1(@PathVariable String variable) {
        logger.info("@PathVariable을 통해 들어온 값 : {}", variable);
        return variable;
    }
}
반응형

댓글