Spring

Spring Boot에서 로깅해보기

teo_99 2023. 5. 1. 01:28

로그, 로깅?

로그(log)란, 시스템의 작동 정보를 의미합니다. 

 

그리고 이런 이런 로그들은 필요에 따라 기록되어야 하는데요, 

시스템 실행 중에 발생하는 이벤트나 트랜잭션, 오류 등과 같은 정보는 때에 따라서는 누락되어서는 안됩니다. 이런 정보는 에러나 장애가 발생했을 때 사용될 수도 있고, 분석 데이터로도 활용될 수 있습니다.

 

그리고 이런 로그들을 작성하는 것을 로깅이라고 합니다.

 

Spring Boot에서의 로깅

Spring Boot에서는 로깅 구현체들을 위한 두 개의 인터페이스가 존재하는데요. 바로 JCL(Jakarta Commons Logging)과 SLF4J(Simple Logging Facade For Java)입니다. JCL 구현체들은 초기의 스프링에서 사용되었고 클래스로딩 타임에 구현체를 선택해야 한다는 문제로 최근에는 SLF4J 구현체들이 주로 사용됩니다.

 

Spring Boot는 spring-boot-starter-logging을 함께 제공하고 있는데요, spring-boot-starter-logging에서는 Logback이라는 SLF4J 로깅 구현체를 기본적으로 사용합니다. 따라서 저희가 Spring Boot 어플리케이션을 돌렸을 때 터미널에 나타나는 수많은 로그는 모두 Logback이라는 구현체에 의해 생성되는 것이라 생각해도 되겠네요.

 

 

로깅해보자!

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

@RestControllerAdvice
public class ExceptionAdvice {

    private final Logger logger = LoggerFactory.getLogger(getClass());
    
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ExceptionResponse> handleException(Exception e) {
        ExceptionResponse exception = new ExceptionResponse("예상하지 못한 오류가 발생했습니다.");
        logger.error(exception.getMessage(), e);

        return ResponseEntity.internalServerError().body(exception);
    }

Logger를 사용하는 방법은 간단합니다.

구현체 선택은 LoggerFactory에게 맡기고, 저희는 getLogger 메소드만 호출해주면 됩니다.

 

참고로 getLogger의 인자로 getClass()를 넣어주었는데요, 이는 Logger의 이름을 클래스명으로 하겠다는 것을 의미합니다. 굳이 getClass()가 아니더라도 임의의 Logger 이름을 넣어줘도 됩니다. 하지만 터미널에서 보았을 때, 어느 Logger가 작성한 로그인지 빠르게 판단하기 위해서는 getClass()로 클래스명을 명시하는게 낫겠죠.

 

로깅 구현체를 이처럼 선언했다면, log.error()처럼 바로 사용하면 되는데요. 실제로 아래와 같이 로깅이 되는 것을 확인할 수 있었습니다.

log.error()를 사용했을 때의 모습

 

 

로그 레벨

로그는 상세하게 레벨을 지정해줄 수 있습니다.

 

5가지로그 레벨이 존재하는데요,

  1. Error: 예상하지 못한 심각한 문제가 발생하는 경우, 즉시 조취를 취해야 할 수준의 레벨
  2. Warn: 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리, 당장 서비스 운영에는 영향이 없지만 주의해야 할 부분
  3. Info: 운영에 참고할만한 사항, 중요한 비즈니스 프로세스가 완료됨
  4. Debug: 개발 단계에서 사용하며, SQL 로깅을 할 수 있음
  5. Trace: 모든 레벨에 대한 로깅이 추적되므로 개발 단계에서 사용함

 

심각도 수준은 Error > Warn > Info > Debug > Trace 순입니다.

그리고 Spring 에서는 기본적으로 Info 이상의 심각도를 가진 로그 레벨만 사용할 수 있습니다.

만약 별다른 설정 없이 Debug, Trace 수준의 로그를 사용한다면 로깅이 제대로 되지 않습니다.

로그 레벨 수준 설정은 Spring 환경설정(application.properties 같은 친구들)을 통해 가능합니다.

 

마무리

Spring Boot에서의 로깅에 대해 간략하게 알아보았습니다.

사실 로깅 자체도 되게 깊은 내용이라, 자세한 내용이 궁금하시다면 따로 문서를 찾아보시는 걸 권합니다.

감사합니다.

 

 


참고 자료

https://dololak.tistory.com/635

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging

https://tecoble.techcourse.co.kr/post/2021-08-07-logback-tutorial/