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 보다 낮아 출력이 안되는 경우에 발생한다.
"{}"를 통해 변수를 표현하는 연산의 경우 "{}" 부분에 변수를 대입하여 문자열을 생성하는 연산을 수행하지 않지만,
"+"를 통해 변수를 표현하는 연산의 경우 실제로 문자열을 만드는 연산을 수행하게 된다. 즉, 불필요한 문자열 생성 연산이 추가되는 것
출력을 하지도 않을 로그 메시지를 연산하는 과정은 불필요한 리소스 소모이기 때문에 "+" 연산을 통한 로그 메시지 작성은 지양해야한다.