실무에서는 로그 관리에 있어 SLF4J 인터페이스를 사용하고, 그 구현체로 Logback 라이브러리를 선택한다.
** 콘솔 뿐만 아니라 별도의 위치에 로그를 남길 수도 있으며, 네트워크로 로그를 전송할 수도 있다.
# @RestController 어노테이션
@Controller 는 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다. @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력하여 문자열을 반환하면 그대로 String이 반환된다.
# slf4j 인터페이스
Logger 자료형과 LoggerFactory를 할 때 slf4j 인터페이스를 선택한다.
시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지 등 System.out.println 보다 더 많은 정보를 제공 받는다.
# log.{trace > debug > info > warn > error} 레벨 설정
로그를 찍을 때 레벨을 정할 수 있다.
그렇다면 trace와 debug는 로그가 찍히지 않았을까? 왜냐하면 default로 info 수준 이상의 로그가 찍히도록 설정되었기 때문이다. application.properties에서 이를 수정할 수 있다.
# application.properties
# hello.springmvc 패키지와 그 하위 로그 레벨을 설정할 수 있다
logging.level.hello.springmvc=trace
일반적으로 운영 서버에는 너무 많은 로그가 생성되지 않도록 하기 위해 info 레벨의 로그를 남기며, 개발 서버에는 debug 레벨의 로그를 남긴다.
package hello.springmvc.basic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@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);
return "ok";
}
}
Lombok이 dependencies에 추가되어 있다면, @Slf4j 어노테이션을 통해 다음 구문을 생략할 수 있다.
@Slf4j
@RestController
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(getClass());
...
}
주의 사항!!
문법대로라면 + 연산을 통해서 기록할 수도 있다. 과연 올바른 방법일까?
log.trace("trace log={}", name);
log.trace("trace log" + name);
만약 로그 레벨이 debug라고 설정되어 있다고 가정해보자. 그렇다면 이 로그 레벨보다 하위 레벨인 trace는 출력되지 않는다.
logging.level.hello.springmvc=debug
하지만 Java 언어의 특성 상 아래 메서드를 호출하기 전에 + 연산을 실행한다. 연산을 실행하면서 메모리도 사용하고, CPU도 할당되는데 이렇게 trace 로그가 찍히지도 않으면서 불필요한 리소스 낭비가 발생하는 것이다.
log.trace("trace log" + name);
반면에 다음 메서드의 경우 연산이 없고, trace 메서드에서부터 걸러지기 때문에 불필요한 연산이 발생하지 않는다.
log.trace("trace log={}", name);
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] HTTP 요청 - 헤더 & 파라미터 조회(@RequestParam) (0) | 2023.07.22 |
---|---|
[Spring] RequestMapping _ API 매핑 (0) | 2023.07.22 |
[Spring] MVC _ @RequestMapping (2) (0) | 2023.07.22 |
[Spring] MVC _ @RequestMapping (1) (0) | 2023.07.22 |
[Spring] MVC _ 어댑터 패턴 (0) | 2023.07.19 |