보통 우리가 실제 프로젝트 이외의 연습을 할 때는 다음과 같이 println 메소드를 사용해 콘솔창에 출력한다
String name = "Spring";
System.out.println("name = " + name);
그런데, 다음과 같이 println 메소드는 단점이 여러가지 있다.
로그의 기능들을 살펴보면 그 단점을 더 명확히 이해할 수 있다.
Slf4j는 스프링부트의 로깅 라이브러리인 spring-boot-starter-logging
에 포함되는 라이브러리이다.
Slf4j는 인터페이스이고, 그 구현체로 Logback과 같은 로그 라이브러리를 선택한다.
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//@Slf4j
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest() {
String name = "Spring";
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.debug("String concat log=" + name);
return "ok";
}
}
private final Logger log = LoggerFactory.getLogger(getClass());
를 이용해 Logger 객체를 이용해 log를 찍을 수 있다@Slf4j
애노테이션을 이용하면 위와 같이 final 필드로 직접 선언하지 않고도 알아서 Logger 객체가 생성된다로그 레벨은
LEVEL: TRACE > DEBUG > INFO > WARN > ERROR(갈수록 레벨이 낮아진다)
와 같은 순서인데, Trace 레벨에서 출력하면 그 아래 레벨들의 로그가 모두 출력되고
Debug 레벨에서 로그를 출력하면 Trace 레벨을 제외한 모든 로그가 출력된다.
그런데, 실무에서는 개발 서버와 운영서버를 분리하는 경우가 대부분이다.
서버의 역할에 따라 개발서버에서는 Debug 레벨까지 찍고, 운영서버에서는 Info 레벨까지만 찍고싶을 수도 있다.
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug
application.properties
파일에 위와 같은 설정을 넣어주면, 경로에 따라 로그 레벨을 설정해줄 수 있다
log.debug("debug log={}", name); // 1
log.debug("debug log={}" + name); // 2
다음 1번과 2번의 차이가 있다.
2번의 경우에는 + 를 통한 연산이 일어나 메모리에 저장이 된다.
그러나 만약 info 레벨까지만 로그를 출력한다면, debug레벨에서 실행된 연산값은 출력되지않고, 계속 메모리에 남아있을 것이다.
결국! 메모리 낭비가 일어난다.
그래서 무조건!! 1번의 방식으로 로그를 출력해야한다.
안그러면 시니어 개발자분께 맴매를 맞을 것이다!