Develop/TIL(Today I Learned)

SpringBoot 기준 log 정리

IJY 2023. 2. 2. 19:28

SpringBoot 프로젝트의 경우 "spring-boot-starter-web" 의존성 내에 "spring-boot-starter-logging" 의존성이 포함되어 있으며, 해당 의존성에는 다음과 같은 로그 관련 라이브러리들이 포함되어있다.

  • logback
  • slf4j
  • log4j

여기서 slf4j는 여러가지 로그 관련 라이브러리들을 통일된 방식으로 사용할 수 있도록 지원하는 인터페이스라고 보면 되고,

실제로 로그를 사용할 수 있도록 지원해주는 라이브러리들이 logback, log4j 라고 보면 된다.

그리고 SpringBoot 프로젝트에서는 기본적으로 logback을 사용한다.

 

사용 방법

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public LogTest {
    private final Logger log = LoggerFactory.getLogger(getClass());
    
    public logTets() {
        String name = "Log Test";
        
        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);
    }
}

위와 같은 방식으로 쉽게 로그를 작성할 수 있다.

lombok 라이브러리를 사용한다면 위 코드를 아래와 같이 더 쉽게 변경할 수 있다.

import lombok.extern.slf4j.Slf4j;

@Slf4j
public LogTest {    
    public logTets() {
        String name = "Log Test";
        
    	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);
    }
}

 

유의할 점

log 작성 시 다음과 같이 작성이 가능하며, 두 코드의 출력은 똑같다.

String name = "Log Test";

log.trace("trace log={}", name);
log.trace("trace log=" + name);

하지만 출력이 같다고 하더라도 두 코드에는 큰 차이가 발생하며, 이는 설정된 log level 보다 낮아 출력이 안되는 경우에 발생한다.

"{}"를 통해 변수를 표현하는 연산의 경우 "{}" 부분에 변수를 대입하여 문자열을 생성하는 연산을 수행하지 않지만,

"+"를 통해 변수를 표현하는 연산의 경우 실제로 문자열을 만드는 연산을 수행하게 된다. 즉, 불필요한 문자열 생성 연산이 추가되는 것

출력을 하지도 않을 로그 메시지를 연산하는 과정은 불필요한 리소스 소모이기 때문에 "+" 연산을 통한 로그 메시지 작성은 지양해야한다.