본문 바로가기
Web/spring study

[Spring] SLF4J 로깅 간단한 정리

by 장인이 2023. 5. 24.

 

1. 개요

 이번 게시물에서는 로그 사용법에 대해서 알아 볼 것이다. 사실 깊이있게 들어가면 공부할 내용들이 많지만, 우선 간단하게 로그를 왜 사용해야 하는지, 실제로 사용하는 방법들 위주로 작성할 예정이다.

 

2. 로깅

 코딩을 하다 보면, 여러 정보를 확인하기 위해서 콘솔에 직접 값을 출력하고 싶을 때가 있다. 이때, System.out.println()와 같이 직접 출력하는 것이 아닌, 로그를 사용해 남기면 다음과 같은 이점이 있다.

 

- 성능이 더 뛰어남

- 상황에 맞춰서 로그를 출력할지 결정할 수 있음

- 로그 기록을 파일 혹은 별도의 위치에 남길 수 있음

 

 Logback, Log4J, Log4J2 등 많은 라이브러리가 있으며, 이를 통합해서 제공하는 것이 SLF4J 라이브러리다. 실제로는 스프링 부트가 기본으로 제공하고 있는 Logback를 대부분 이용한다.

 

3. LoggerFactory

 직접 인스턴스를 생성해서 로깅하는 방법이 있다. 방법은 다음과 같다.

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

public class LoggerFactoryTest {
    private static final Logger logger = LoggerFactory.getLogger(LoggerFactoryTest.class);
    
    public static void main(String[] args) {
    	logger.info("logger test");
    }
}

하지만, 아래 방법을 주로 사용한다.

 

4. @Slf4j

 많이 사용하는 방법으로, Lombok의 어노테이션인 @Slf4j를 사용한다. 해당 annotation을 클래스 레벨에 붙이면, 해당 클래스에서 로깅이 사용 가능해진다. 이때, 변수명을 log로 고정된다.

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Slf4jTest {
    public static void main(String[] args) {
        String name = "Slf4j log";

        log.trace("trace log={}", name);
        log.debug("debug log={}", name);
        log.info("info log={}", name);
        log.warn("warn log={}", name);
        log.error("error log={}", name);
    }
}

 5단계의 레벨로 나누어지며, 단계는 다음과 같다. 단어를 해석해봐도, 오른쪽으로 갈수록 중요한 로그임을 알 수 있다.

- TRACE > DEBUG > INFO > WARN > ERROR

 

- TRACE: DEBUG보다 더 상세한 정보

- DEBUG: 프로그램을 디버깅하기 위한 정보

- INFO: 상태변경과 같은 정보성 메시지

- WARN: 처리 가능한 문제, 혹은 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지

- ERROR: 요청을 처리하는 중 문제가 발생한 경우

 

 위에 적은 코드를 실행하면, 기본 세팅에서는 info, warn, error에 담은 로그만 출력될 것이다. 이를 변경하고 싶으면, application.properties에서 설정을 해주면 된다. 이때  세팅한 단계보다 중요도가 낮은 로그는 출력하지 않으며, 기본값은 info이다.

- logging.level.root=debug

 

 참고로 특정 패키지만 로그 세팅을 변경하고 싶으면, application.properties에 다음과 같이 입력하면 된다. 아래와 같이 입력 시 hello.springmvc 패키지와 하위 로그 레벨을 debug으로 설정해준다.

- logging.level.hello.springmvc=debug

 

 또한, 보통 파라미터 값이나 전달 값을 로그로 출력하곤 한다. 이때 + 연산자를 사용하면 찍을 필요가 없는 로그에도 문자열 연산자가 실행되어 리소스 낭비가 된다. 따라서, @Slf4j의 {}를 사용하면 이 문제를 해결할 수 있다.

 

 


위 내용은 김영한 님의 인프런 강의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

댓글