본문 바로가기
Spring

logging @SLF4J

by PROMISE_YOO 2022. 1. 4.

이전에 블로그에 2021.08.21 - [Java] - 운영서비스에서 System.out.println 을 절대 쓰지 않는 이유라는 포스팅을 한 적이 있습니다. 프로젝트에 Exception 로그를 남기위해 System.out.println 대신 @SLF4J를 사용해봤습니다. 

 

SLF4J(Simple Logging Facade for Java)

다양한 로깅 프레임워크(예: java.util.logging, logback, log4j)에 대한 추상화 역할을 하여 개발자가 원하는 로깅 프레임워크를 연결할 수 있도록 합니다. 다시말해, logback이나 log4j2와 같은 로킹 프레임워크의 인터페이스의 역할을 합니다.

SLF4J 공식페이지에서 제공하는 그림을 보면 SLF4J 인터페이스가 다양한 로깅 프레임워크(java.util.logging, logback, log4j 등)를 바인딩 해주는 것을 확인할 수 있습니다.

 

출처 : https://www.slf4j.org/manual.html

 

 

SLF4J 사용방법

1. 기본적으로 SLF4J 의존성을 추가하기

<dependency> 
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>${latest.stable.version}</version>
</dependency>

Spring Boot는 자동으로 의존성을 추가 해줍니다.

실제 프로젝트 의존성을 확인해 봤습니다. 자동으로 SLF4J 의존성이 잡혀있습니다.

 

2. SLF4J 관련 코드 추가하는 2가지 방법

 

방법 1 ) Logger 객체를 직접 불러와서 사용하기

 

1. import 합니다.

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

 

2. LoggerFactory.getLogger() 메소드를 통해 Logger타입 객체 가져오기.

private final Logger logger = LoggerFactory.getLogger(로그를 남길 클래스명.class); 입력하기

 

3. logger의 메소드 사용하기 

제 경우 에러 로그를 남기기 위해 error()메소드를 사용했습니다.

logger.error("아이디가 일치하지 않습니다", InvalidPasswordException.class);

 

error(), info(), trace(), warn() 등 로그를 남기기 위한 많은 메소드가 있습니다. 

각 메소드 정보가 들어있는 페이지를 공유합니다.

https://www.slf4j.org/apidocs/index.html

 

 

프로젝트에서 Exception 사이에 로그를 남기기 위해 ControllerAdvice 내에 log관련 코드를 입력합니다.

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

@ControllerAdvice
public class GlobalExceptionHandler {

  private final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
  
    @ExceptionHandler
  public ResponseEntity<HttpStatus> loginExceptionHandler(InvalidPasswordException e) {
    logger.error("아이디 혹은 패스워드가 일치하지 않습니다.!!", InvalidPasswordException.class);
    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
  }
}

로그가 잘 찍히는 것을 확인할 수 있습니다.

 


 

방법2) @SLF4J 어노테이션을 사용하기

 

- @SLF4J 어노테이션을 사용한다면 따로 getLogger()메소드로 Logger 를 생성하지않고 자동으로 생성된 log를 사용해 error() 메소드를 바로 사용할 수 있습니다.

@Slf4j
public class GlobalExceptionHandler {

  @ExceptionHandler
  public ResponseEntity<BasicResponse> loginExceptionHandler(InvalidPasswordException e) {
    log.error("아이디 혹은 패스워드가 일치하지 않습니다.!!", InvalidPasswordException.class);
    return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
  }
}