보통 println() 같은 시스템 콘솔을 사용하여 디버깅을 진행하였는데,
실무(실제 운영시스템)에서는 별도의 로깅 라이브러리를 사용하여 로그를 출력한다.
로깅 라이브러리
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다.
스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용
- SLF4J
- Logback
로그 라이브러리는 Logback, Log4J, Log4J2 등등 수많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리이다.
로그 선언
- private Logger log = LoggerFactory.getLogger(getClass());
- private static final Logger log = LoggerFactory.getLogger(클래스명.class);
- @Slf4j : 롬복 사용가능
로그 호출
- log.info("hello")
- log.info("name={}", name) 과 같이 변수를 삽입할 수도 있음
@RestController
- @Controller는 반환 값이 String이면 ViewName을 인식하여 뷰를 찾고 뷰가 렌더링된다.
- @RestController(REST API의 그 REST 맞음)는 반환 값으로 뷰를 찾는 것이 아니라, String을 그대로 반환하여 HTTP 메시지 바디에 입력한다.
위와 같이 로그를 작성하고 해당 url로 접속하면
@RestController에 의해 ok가 출력되고 로그가 찍힌다.
한 눈에 봐도 알 수 있듯이 로그는 단순 println출력보다 훨씬 유용하고 많은 정보를 담고 있다.
시간, 로그 레벌, 프로세스 ID, 쓰레드 명, 클래스 명, 로그 메시지의 정보를 담고 있다.
trace, debug레벨의 로그는 출력되지 않은 것을 확인할 수 있는데 이는 설정을 통해 레벨을 조절할 수 있다.
LEVEL : TRACE > DEBUG > INFO > WARN > ERROR
로그 레벨을 설정하는 이유는 개발 서버와 운영 서버에 로그의 차이를 두기 위해서이다.
개발 서버는 개발자가 컨트롤하는 뒷단의 서버이므로 Debug같은 상세한 정보까지 출력하고
운영 서버에는 Info 이하의 정말 필요한 로그들만 출력시키도록 한다.
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug
- Lombok이 제공하는 애노테이션인 @Slf4j를 사용하면 로그의 선언없이 위와 같이 바로 사용할 수 있다.
올바른 로그 사용법
log.debug("data="+data)
- 로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data="+data가 실제 실행이 되어 버린다.
- 결과적으로 문자 더하기 연산이 발생한다.
- 연산이 발생하므로, 메모리, CPU 사용
log.debug("data={}", data)
- 로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다. 따라서 앞과 같은 의미없는 연산이 발생하지 않는다.
- 메서드를 호출하고 파라미터를 넘기는 것이므로 연산 발생 X
로그 사용시 장점
쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다. 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를 사용해야 한다.
반응형
'Spring > Spring MVC' 카테고리의 다른 글
HTTP 요청 - 헤더 정보 (0) | 2021.05.07 |
---|---|
요청 매핑 (0) | 2021.05.06 |
Spring MVC (0) | 2021.05.01 |
ViewResolver (0) | 2021.05.01 |
Handler Mapping & Handler Adapter (0) | 2021.04.30 |