[Project / Spring] 스프링 프로젝트에서 Lombok 쓰지 않고 로그를 찍어보자

clean·2024년 4월 5일
0

mewsinsa 기록

목록 보기
2/7
post-thumbnail

log함수 찍는 방법이 아니라, logging하는 방법을 담은 글입니다

요즘 무신사 클론 프로젝트인 뮤신사 API를 구현하고 있는데요.
프로젝트는 롬복 라이브러리를 쓰지 않으면서 진행하고 있습니다.

그래서 Getter, Setter도, Builder도 그리고 Logger도 직접 선언해서 써야하는데요,
사실 로그 찍을 때 항상 @Slf4 띡 찍으면 log.info("")를 쉽게 쓸 수 있었어서, 직접 로그 객체를 선언하는 방법을 까먹었습니다. (^^;)
사실 다시 공부하기가 귀찮아서 그냥 System.out.println()으로 버티고 있었는데, 이제 더이상 미루면 안될 것 같아 김영한 님 강의를 보며 다시 로그에 대해서 공부해보려고 합니다.

Logback과 Slf4j

우선 로그를 찍으려면 로깅과 관련된 라이브러리를 프로젝트에 포함시켜야겠죠.
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리인 spring-boot-starter-logging이 함께 포함됩니다.

스프링 부트의 로깅 라이브러리는 기본으로 아래 로깅 라이브러리를 포함합니다.

  • Slf4j
  • Logback

Slf4j는 인터페이스, Logback은 그 인터페이스의 구현체입니다. (구현체는 Logback말고도 더 많이 존재합니다.)

Log 객체 만들고 로그 찍기

로그를 찍어야하는 class 안에 다음과 같이 로그 객체를 만들어줍니다.

private final Logger log = LoggerFactory.getLogger(getClass());

Loggerorg.slf4j 패키지에 있는 인터페이스로, 여기에 여러 로그 구현체를 넣을 수 있습니다.

LoggerFactoryorg.slf4j안에 존재하는 클래스로, 매개변수로 전달된 클래스의 이름에 해당하는 로거 구현체를 리턴한다고 합니다.
아래는 LoggerFactory에 대한 자세한 설명입니다.

사실 gerLogger(getClass())이렇게 했는데 어떻게 구현체가 리턴되는지는 잘 모르겠습니다.. getClass()가 네이티브 코드인데 이 안에서 무슨일이 생기는건지는 더 찾아보아야 할 것 같습니다.

이렇게 하면 일단 로그를 찍을 수 있는 준비는 끝났습니다.

log.info("로그내용");을 쓰면 프로그램을 돌렸을 때 로그가 나오는 것을 확인하실 수 있습니다.

단계별로 로그 찍기

로그는 단계 별로 찍는 것도 가능합니다.

  @ResponseBody
  @GetMapping("/logtest")
  public String logTest() {
    log.trace("trace log");
    log.debug("debug log");
    log.info("info log");
    log.warn("warn log");
    log.error("error log");
    return "logtest";
  }

이제 저 uri로 get 요청을 보내면

이렇게 로그가 찍힙니다.
좌측에는 로그가 어떤 레벨인지가 표시되네요.

trace < debug < info < warn < error

오른쪽으로 갈수록 심각성과 중요도가 높은 로그라고 볼 수 있습니다.
그런데 잘 보면 trace로그는 찍히지 않은 상태인데요. 어떻게 된 걸까요?

바로 제 프로젝트가 debug레벨의 로그부터 보겠다고 설정돼있는 상태이기 때문입니다.
로그 레벨에 대한 설정은 resources 폴더에 있는 application.properties에서 바꿀 수 있습니다.
이런 문장을 넣어주면 debug 레벨부터 로그를 볼 수 있게 됩니다.

logging.level.hello.itemservice=debug

loggin.level 뒤에 있는 hello.itemservice는 패키지의 이름으로, 이는 저 패키지에 하위에 있는 파일들에 저 내용을 적용하겠다는 의미입니다.
따라서 여러 패키지에 서로 다른 로그 설정을 적용할 수도 있습니다.

참고로 default는 info인듯합니다. 저 문장을 빼고 돌리니 info 로그부터 찍히네요.

application.yml을 사용하는 경우, 이렇게 설정할 수 있습니다.

logging:
  level:
    '패키지 또는 클래스의 경로': TRACE

지금까지 스프링 부트 프로젝트에서 직접 로그 객체를 만들어서 로그를 찍는 방법에 대해 알아보았습니다.

확실히 롬복을 쓰지 않으니 불편하기는 하지만 전에 편하게 썼던 만큼 제가 잊고 있었거나 모르고 지나갈뻔한 것들이 많았다는 것을 깨닫는 것 같습니다.

Reference

profile
블로그 이전하려고 합니다! 👉 https://onfonf.tistory.com 🍀

0개의 댓글