System.out 대신 SLF4J로 로그 남기기
System.out.println 대신 SLF4J 로거를 써야 하는 이유와 로그 레벨 설정, Lombok @Slf4j 사용법을 정리한다.
시리즈 · Spring6 / 14
- SOLID 원칙과 OCP·DIP를 지키는 방법
- 의존성 주입(DI)과 스프링 컨테이너
- 쓰레드 풀과 싱글톤 서블릿의 동시성 문제
- FrontController 패턴과 핸들러 어댑터로 스프링 MVC 구조 이해하기
- @ModelAttribute와 PRG 패턴으로 폼 요청 처리하기
- System.out 대신 SLF4J로 로그 남기기
- 세션 직접 만들어 보기와 HttpSession
- 스프링 인터셉터와 예외 발생 시 오류 페이지 흐름
- 서블릿 Part와 MultipartFile로 파일 업로드 처리하기
- JDBC로 CRUD 구현하기와 커넥션 풀, DataSource
- JDBC 트랜잭션에서 스프링 트랜잭션 동기화와 트랜잭션 AOP까지
- JPA 변경 감지(dirty checking)와 병합(merge)
- 서블릿 컨테이너 초기화와 스프링 컨테이너 등록 과정
- 싱글톤 빈의 동시성 문제와 ThreadLocal
서버 로그를 System.out.println()으로 남기면 문제가 있다.
- 로그 레벨 구분 없이 항상 출력되므로, 사용자가 급격히 늘면 모든 로그를 콘솔에 찍느라 부담이 커진다.
- 해당 출력이 어디에서 나온 것인지 찾기 어렵다.
그래서 실무에서는 SLF4J 로거를 사용해 로그를 남긴다.
Logger 사용
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest() {
String name = "spring";
System.out.println("logger를 통한 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);
return "ok";
}
}
로거를 사용하면 시간, 로그 레벨, 프로세스 ID, 쓰레드 이름, 클래스 이름이 함께 출력된다. 콘솔뿐 아니라 파일로도 남길 수 있다.
logger를 통한 log 출력
2022-04-05 12:08:08.481 TRACE 1585 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : trace log=spring
2022-04-05 12:08:08.484 DEBUG 1585 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : debug log=spring
2022-04-05 12:08:08.485 INFO 1585 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : info log=spring
2022-04-05 12:08:08.485 WARN 1585 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : warn log=spring
2022-04-05 12:08:08.485 ERROR 1585 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : error log=spring
로그 레벨 설정
application.properties에서 패키지 단위로 로그 레벨을 설정할 수 있다. 지정한 패키지와 그 하위 패키지에 적용된다.
# 기본값은 info
logging.level.hello.springmvc=debug
레벨은 TRACE < DEBUG < INFO < WARN < ERROR 순이며 설정한 레벨 이상만 출력된다. info로 설정하면 info, warn, error가 출력되고, error로 설정하면 error만 출력된다.
Lombok @Slf4j
Lombok의 @Slf4j 애노테이션을 붙이면 로거 선언을 생략하고 log 변수를 바로 쓸 수 있다.
@Slf4j
@RestController
public class LogTestController {
@RequestMapping("/log-test")
public String logTest() {
String name = "spring";
log.info(" info log={}", name);
return "ok";
}
}
참고
- 김영한, 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (인프런)