본 포스팅은 인프런 - 스프링 MVC 1편을 강의를 바탕으로 공부하고 정리한 글입니다.
로깅
운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용해 필요한 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해 로그를 출력한다.
SLF4J, Logback
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함되는데, 이 라이브러리는 기본적으로 내부에 다음 로깅 라이브러리를 사용한다.
- SLF4J : http://www.slf4j.org
- Logback : http://logback.qos.ch
로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다. 즉 SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리를 선택하면 된다.
실무에서는 대부분 스프링 부트가 기본으로 제공하는 Logback을 로그 라이브러리로 사용한다.
선언 및 호출
로깅을 사용하려면 우선 로깅 객체를 생성해야하는데, 다음과 같이 선언해 사용한다.
👉🏻 선언
1. 클래스 참조변수 선언
// 방법1 - getClass()를 통해 현재 사용되는 클래스를 반환하여 삽입
private Logger log = LoggerFactory.getLogger(getClass());
// 방법2 - 직접적으로 해당 클래스타입을 입력해 삽입
private static final Logger log = LoggerFactory.getLogger(Xxx.class)JAVA
2. 롬복 사용
@Slf4j
public class LogTestController() {}JAVA
- 롬복 라이브러리를 사용할 경우 @Slf4j 어노테이션으로 간단하게 사용할 수 있다.
👉🏻 호출
선언해준 뒤 로그를 출력하기 위해서는 다음과 같이 사용한다.
log.info("hello")JAVA
- Sytem.out.println("hello")처럼 시스템 콘솔로 직접 출력하는 것보다 위와 같이 로그를 사용하는 것이 좋다.
예제
📁 basic/LogTestController
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/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";
}
}
- @RestController
- @Controller는 반환 타입이 String일 경우 뷰 이름(논리 이름)으로 인식하기 때문에 뷰 리졸버가 뷰를 찾고 렌더링 된다.
- @RestController는 반환 값으로 뷰를 찾는 것이 아니라 HTTP 메세지 바디에 데이터를 바로 입력해 응답을 준다.
- 따라서 실행 결과로 ok메세지를 확인할 수 있다.
- 실행 결과
로그 레벨 설정
로그에는 레벨이 있다.
로그 레벨을 설정해줄 경우 설정 로그보다 높은 레벨이 로그에 출력된다. 따라서 로그 레벨을 원하는 대로 설정해 필요한 로그만 남도록 할 수 있다.
로그 레벨은 application.properties 파일을 통해 세팅 해준다.
📁 application.properties
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨(trace, debug, info, warn, error) 설정
logging.level.hello.springmvc=debugJAVA
- 로그 레벨 : trace < debug < info(기본값) < warn < error
- 개발 서버는 debug 출력
- 운영 서버는 info 출력
올바른 로그 사용법
💡 잘못된 사용법
log.debug("data = " + data)JAVA
- 로그 출력 레벨을 info로 설정해도 debug 레벨의 "data = " + data의 연산이 수행된다. → 의미없는 연산 발생 O
- 즉, 자바 컴파일 시점에서 사용하지도 않는 debug 레벨의 연산을 진행해 리소스 낭비가 생긴다.
💡 올바른 사용법
log.debug("data = {}", data)JAVA
- 로그 출력 레벨이 debug 이상일 경우, 수행되지 않는다. → 의미없는 연산 발생 X
로그 사용의 장점
- 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
- 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
- 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등 로그를 별도의 위치에 남길 수 있다.
특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다. - 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등)
따라서 실무에서는 꼭 로그를 사용해야 한다. 😇
'🌱 Spring > Web MVC' 카테고리의 다른 글
Bean Validation (0) | 2022.04.30 |
---|---|
Validation (0) | 2022.04.26 |
타임리프(Thymeleaf) (1) | 2022.03.23 |
스프링 MVC 웹 페이지 만들기 (0) | 2022.03.22 |
스프링 MVC 기본 기능 (0) | 2022.03.18 |
스프링 MVC 구조 이해하기 (0) | 2022.03.17 |
MVC 프레임워크 만들기 (0) | 2022.03.16 |
서블릿, JSP, MVC 패턴으로 웹 애플리케이션 개발하기 (0) | 2022.03.15 |