이전에 블로그에 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는 자동으로 의존성을 추가 해줍니다.
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();
}
}
'Spring' 카테고리의 다른 글
로그인 체크 기능 간결하고 낮은 결합도로 구현해보기 (0) | 2022.01.28 |
---|---|
스프링 부트 AutoConfiguration 원리 (0) | 2022.01.15 |
SpringBoot의 의존성 버전 관리와 원리 (0) | 2022.01.04 |
HttpSession을 단위 테스트하기 위한 방법 (0) | 2021.11.20 |
H2 DB 사용해보기 (0) | 2021.11.07 |