본 글은 김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의를 토대로 작성하였습니다.
스프링에서는 기본 로그 라이브러리로 Slf4j라는 인터페이스를 선택하고 있다. 또한 그 구현체로 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가 가장 레벨이 높으므로 모든 레벨의 로그가 전부 출력된다.
추가로 위에서 보면 로그 메시지를 찍을 때 {}를 이용하여 name 변수를 파라미터로 넘겨 문자를 찍는 방식을 선택하고 있다. 이와 비슷하게
log.info("info log = " + name);
이러한 방식으로도 쓸 수 있는데 굳이 파라미터로 넘기는 방식을 사용하는 이유는, Java의 동작 방식과 관련이 있다.
만약 로그 레벨이 info라면 trace와 debug 레벨의 로그들은 찍히지 않게 된다. 이 상황에서
먼저 + 를 이용한다면 메세지를 찍는 코드는 자바에서 해당 구문을 실행할 때 다음 순서로 이루어진다.
반면에 파라미터 방식을 이용하면
이처럼 파라미터 방식을 사용하면 쓸데없는 CPU자원과 메모리 사용을 방지할 수 있다.
로그를 찍을 때는 파라미터 방식을 사용하자❗️
위와 같이 로그 객체를 만들어 해당 객체를 사용하여 로그를 찍는 방법을 소개했는데, 로그를 사용하려면 객체를 생성하는 것조차 귀찮다.
그.래.서 Lombok 라이브러리를 사용하면 이 또한 어노테이션 하나면 해결 가능하다.
@Slf4j
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(getClass());
다음과 같이 클래스 단위에 @Slf4j를 입력하면 객체를 알아서 생성해준다. 따라서 따로 객체를 만들어놓을 필요 없이 그냥 사용하면 된다. (저 한 줄이 귀찮아서 그냥 어노테이션 만들어보림ㅇㅇ)