• spring
  • logging

System.out 대신 SLF4J로 로그 남기기

System.out.println 대신 SLF4J 로거를 써야 하는 이유와 로그 레벨 설정, Lombok @Slf4j 사용법을 정리한다.

시리즈 · Spring6 / 14
  1. SOLID 원칙과 OCP·DIP를 지키는 방법
  2. 의존성 주입(DI)과 스프링 컨테이너
  3. 쓰레드 풀과 싱글톤 서블릿의 동시성 문제
  4. FrontController 패턴과 핸들러 어댑터로 스프링 MVC 구조 이해하기
  5. @ModelAttribute와 PRG 패턴으로 폼 요청 처리하기
  6. System.out 대신 SLF4J로 로그 남기기
  7. 세션 직접 만들어 보기와 HttpSession
  8. 스프링 인터셉터와 예외 발생 시 오류 페이지 흐름
  9. 서블릿 Part와 MultipartFile로 파일 업로드 처리하기
  10. JDBC로 CRUD 구현하기와 커넥션 풀, DataSource
  11. JDBC 트랜잭션에서 스프링 트랜잭션 동기화와 트랜잭션 AOP까지
  12. JPA 변경 감지(dirty checking)와 병합(merge)
  13. 서블릿 컨테이너 초기화와 스프링 컨테이너 등록 과정
  14. 싱글톤 빈의 동시성 문제와 ThreadLocal

서버 로그를 System.out.println()으로 남기면 문제가 있다.

  1. 로그 레벨 구분 없이 항상 출력되므로, 사용자가 급격히 늘면 모든 로그를 콘솔에 찍느라 부담이 커진다.
  2. 해당 출력이 어디에서 나온 것인지 찾기 어렵다.

그래서 실무에서는 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편 - 백엔드 웹 개발 핵심 기술 (인프런)