[Spring] Spring Logging feat: Slf4j, Logback, Lombok

김용현·2023년 9월 27일
0

Spring

목록 보기
4/13

본 글은 김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의를 토대로 작성하였습니다.

Spring의 로깅 방법

스프링에서는 기본 로그 라이브러리로 Slf4j라는 인터페이스를 선택하고 있다. 또한 그 구현체로 Logback이라는 구현체를 사용하여 로그 기능을 지원한다.

Logback 사용법

먼저 로그를 사용하려면 해당 로그 객체가 필요하다.

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

다음과 같이 객체를 선언한 뒤

	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);

다음과 같이 로그 레벨에 맞게 사용하면 된다.

로그 레벨 순서
trace > debug > info > warn > error

또한 스프링에서는 기본 로그 레벨이 info로 설정되어 있는데 이 레벨을 변경하여 적용할 수 있다.
resources/application.properties 파일에 가서

#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace

# 전체 로크 레벨 설정(기본 info)
logging.level.root=info

# 우선순위는 패키지가 더 높음(더 자세한 경로 순)

위와 같이 입력하면 된다. 다시 말해, 레벨로 설정한 값보다 낮은 레벨은 모두 출력이 된다.
ex) logging.level.hello.springmvc=trace -> trace가 가장 레벨이 높으므로 모든 레벨의 로그가 전부 출력된다.

❗️팁: 보통 개발 단계에서는 로그 레벨을 debug, 배포 단계에서는 info로 둔다

추가로 위에서 보면 로그 메시지를 찍을 때 {}를 이용하여 name 변수를 파라미터로 넘겨 문자를 찍는 방식을 선택하고 있다. 이와 비슷하게

log.info("info log = " + name);

이러한 방식으로도 쓸 수 있는데 굳이 파라미터로 넘기는 방식을 사용하는 이유는, Java의 동작 방식과 관련이 있다.

만약 로그 레벨이 info라면 trace와 debug 레벨의 로그들은 찍히지 않게 된다. 이 상황에서

먼저 + 를 이용한다면 메세지를 찍는 코드는 자바에서 해당 구문을 실행할 때 다음 순서로 이루어진다.

  1. name 변수를 해당하는 문자열로 치환
  2. 앞의 문자열과 치환된 문자열을 합침
  3. 해당 문자열을 내부에 저장해놓음
  4. trace()함수를 호출하여 로그 메세지 출력하려고 했으나 레벨이 높아 출력 X

반면에 파라미터 방식을 이용하면

  1. trace()함수를 실행하며 파라미터로 name이 넘어감.
  2. 레벨이 높아 함수 실행 중단

이처럼 파라미터 방식을 사용하면 쓸데없는 CPU자원과 메모리 사용을 방지할 수 있다.

결론

로그를 찍을 때는 파라미터 방식을 사용하자❗️

Lombok, Slf4j

위와 같이 로그 객체를 만들어 해당 객체를 사용하여 로그를 찍는 방법을 소개했는데, 로그를 사용하려면 객체를 생성하는 것조차 귀찮다.
그.래.서 Lombok 라이브러리를 사용하면 이 또한 어노테이션 하나면 해결 가능하다.

Lombok 사용법

@Slf4j
public class LogTestController {

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

다음과 같이 클래스 단위에 @Slf4j를 입력하면 객체를 알아서 생성해준다. 따라서 따로 객체를 만들어놓을 필요 없이 그냥 사용하면 된다. (저 한 줄이 귀찮아서 그냥 어노테이션 만들어보림ㅇㅇ)

로그 사용의 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
  • 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
  • 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를
    사용해야 한다.

참고자료

스프링 부트 제공 로그 기능
Slf4j 공식 홈페이지
Logback 관련

profile
평생 여행 다니는게 꿈 💭 👊 😁 🏋️‍♀️ 🦦 🔥

0개의 댓글

관련 채용 정보