이전에 System.out.println()으로 로그를 찍지말라는 얘기를 들었었는데
왜 쓰면 안되는지 이유를 몰랐었다.
이번 포스팅에서는 로그를 어떻게 남겨야하는지 다뤄볼 예정이다.
1. 로깅 라이브러리
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리가 포함된다.
SLF4J 는 Logback, Log4J, Log4J2 등의 라이브러리를 통합한 인터페이스다.
SLF4J 인터페이스로 구현할 때, Logback을 많이 사용하는 추세다.
2. 로그 사용법
Logger를 import할 때, 여러 Logger들이 뜬다.
이때 org.slf4j를 선택해야한다.
package hello.springmvc.basic;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//@Controller을 쓰면 반환값이 String일 때, view이름으로 인식함. '뷰가 렌더링'됨.
//@RestController를 쓰면 return값이 그대로 반환된다.(이 코드에선 String이 그대로 반환)
//RestAPI 만들때 핵심적인 컨트롤러
@Slf4j
@RestController
public class LogTestController {
//private final Logger log = LoggerFactory.getLogger(getClass()); -> @Slf4j 로 대체가능
@RequestMapping("/log-test")
public String logTest(){
String name = "Spring";
System.out.println("name = " + name);
//log를 찍을 때, 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); //에러
return "ok";
}
}
1) @RestController 를 사용한다.
@Controller를 쓰면 반환값이 String일 때, view이름으로 인식하여 뷰가 렌더링 되기 때문이다.
@RestController를 써야 return값이 그대로 반환된다.
2) 로그 선언법
private Logger log = LoggerFactory.getLogger(getClass());
이렇게 코드로 선언해줘도 되지만,
@Slf4j 애노테이션을 사용하여 대체가능하다.
3) log 종류에 따라, 로그 레벨을 지정해줄 수 있다.
application.properties에 설정을 하여 로그 레벨을 지정해준다.
개발서버는 debug , 로컬에서는 trace ,운영에는 info 많이 쓴다.
운영에는 트래픽이 많이 몰리는데 debug나 trace를 쓰면 너무 많은 로그들이 쌓여 시스템에 과부하가 올 수 있기 때문이다.
💡로그 레벨
TRACE > DEBUG > INFO > WARN > ERROR
✅application.properties 설정법
#전체 로그 레벨 설정(기본 info)
#trace, debug로 설정하면 어마어마한 로그가 찍힘.
logging.level.root=info
#전체 로그 레벨 설정 있어도 더 자세하게 레벨 설정한 것이 우선권가짐.
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace
✔️로그 레벨이 info일 때
INFO와 함께 하위 레벨인 WARN, ERROR로그도 함께 출력된다.
✔️로그 레벨이 trace일 때
TRACE의 하위 레벨이 모두 출력된다.
기본적으로 설정을 하지않으면, info레벨로 설정된다.
4) System.out.println을 쓰면 안되는 이유
로깅 라이브러리를 사용하면 개발, 로컬, 운영서버에 맞게 로그레벨을 설정해줄 수 있다.
System.out.println은 그런 구분 없이 모든 서버에 로그를 남긴다.
운영서버에는 모든 로그를 다 남기면 안된다..!
운영서버에 모든 로그를 다 남기면 디버깅할 때, 엄청 지저분한 코드를 봐야한다.
'인프런 김영한 강의 정리 > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
스프링 MVC - MultiValueMap | 자료구조 (0) | 2024.06.01 |
---|---|
스프링 MVC - 구조 이해하기 (0) | 2024.05.30 |