이 내용은 김영한님의 스프링 MVC 1편 중 Log 파트를 정리하는 것
실무에서는 System.out.print()
대신에 Log를 사용한다고 함
스프링 부트를 사용하면 스프링 부트 로깅 라이브러리가 자동으로 포함되어 있음 spring-boot-starterlogging
일단 로그 테스트를 위한 클래스를 하나 만들어보자
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass()); // 혹은 LogTestController.getClass() 해도 됨
@GetMapping("/log-test")
public String logTest() {
String name = "Spring";
System.out.println("name = " + name);
log.info("info log={}", name);
return "ok";
}
}
하고 localhost:8080/log-test 에 접속하게되면
println()은 그냥 콘솔창에서 해당하는 내용만 찍히는 반면
Log는 찍힌 시간, 로그 레벨, 프로세스 ID, 실행한 Thread, 자바 Class 이름 및 경로, 로그 내용 까지
찍는 것은 println()과 다를 게 많이 없지만 그 이후 노출되는 정보는 많은 차이가 있다.
하지만 Log의 진가는 여기에서 끝나지 않는다.
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, 원하는 레벨의 Log를 필터링하여 볼 수 있음
이렇게 설정 후 실행하면
Debug, Warn, Error 만 표시되는 것을 볼 수 있다. (전체 Log의 Level 기본 값이 info)
하지만 Log의 출력 레벨을 조정하면 그 하위 레벨의 로그도 출력할 수 있음
application.properties 파일에서
#hello.springmvc 패키지와 하위 로그 레벨 설정
logging.level.hello.springmvc=trace
Log의 레벨 설정을 진행하면
모든 로그가 다 출력되는 모습을 볼 수 있다.
그리고 이후 배포 시 스프링 부트의 기능을 사용하여 Log의 레벨을 조정할 수 있음
개발 할 때에는 debug 레벨을 사용 => 배포 시에는 info 레벨의 log만 남기기
또한 서버마다 레벨을 변경할 수 있다고 한다.
여기서 Lombok이 제공하는 기능 중 @Slf4j 어노테이션이 있음
@Slf4j
@RestController
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(getClass()); // 혹은 LogTestController.getClass() 해도 됨
@GetMapping("/log-test")
public String logTest() {
String name = "Spring";
System.out.println("name = " + name);
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";
}
}
@Slf4j 어노테이션을 사용하면 Log 필드를 만들지 않아도 바로 로그를 사용할 수 있음
로그의 올바른 사용법
두 로그 출력의 차이점을 알아보자
log.trace("trace log = " + name);
log.trace("trace log = {}", name);
두개의 Log 출력 결과는 똑같음
하지만, 시스템 사용량에서 차이가 생김
자바의 시스템 상 + 연산이 먼저 일어남 => 윗 줄의 로그는 출력은 안되지만 "trace log = Spring" 연산이 진행
아랫 줄의 로그는 {} 내용을 name으로 치환하는 것이기 때문에 연산 자체가 일어나지 않음
한두줄은 상관이 없겠지만 쌓이면 필요하지 않은 연산이 많이 생기기 때문에 이것을 주의해서 사용해야 함
'Spring' 카테고리의 다른 글
240315 도커 (0) | 2024.03.15 |
---|---|
240314 스프링 부트 (2) | 2024.03.14 |
240313 스프링 부트 (1) | 2024.03.13 |
240312 스프링 부트 (0) | 2024.03.12 |
240311 스프링 부트 (0) | 2024.03.11 |