로깅(logging)
로그는 애플리케이션의 실행 상태나 다양한 이벤트를 기록하는 중요한 요소이다. 운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지않고, 별도의 로깅 라이브러리를 통해 이러한 로그를 관리한다.
로깅 라이브러리
스프링 부트는 'Spring-boot-starter-logging' 을 포함하여 기본적인 로깅 라이브러리를 제공한다. 이 라이브러리는 내부적으로 다음과 같은 구성을 가진다.
SLF4J(Simple Logging Facade for Java) : 다양한 로깅(Logback, Log4J, Log4J2)등 라이브러리를 하나의 인터페이스로 통합한다.Logback : SLF4J 인터페이스의 구현체로, 실제 로깅 작업을 수행한다. 실무에서는 스프링부트가 기본으로 제공하는 Logback을 대부분 사용한다.
로그 선언과 호출
Java에서 로그를 사용하기 위해서는 아래와 같이 로그를 선언하고 호출해야 한다.
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(LogTestController.class);
@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";
}
}
@Slf4j
Lombok 라이브러리를 사용한다면 '@Slf4j' 어노테이션을 통해 코드를 간결하게 만들 수 있다
mport lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(LogTestController.class);
@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";
}
}
로그 레벨
로그 레벨은 TRACE -> DEBUG -> INFO -> WARN -> ERROR 순으로 설정할 수 있다.
이는 'application.properties' 파일에서도 설정 가능하다.
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug
로그 출력 메시지
시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지
2023-08-30T14:30:22.355+09:00 INFO 5788 --- [nio-8090-exec-9] h.springmvc.basic.LogTestController : info log=Spring
2023-08-30T14:30:22.355+09:00 WARN 5788 --- [nio-8090-exec-9] h.springmvc.basic.LogTestController : warn log=Spring
2023-08-30T14:30:22.355+09:00 ERROR 5788 --- [nio-8090-exec-9] h.springmvc.basic.LogTestController : error log=Spring
올바른 로그 사용법
log.debug("data="+data)
로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data=" + data 가 실제 실행이 되어 버린다. 결과적으로 문자 + 연산이 발생한다.
log.debug("data={}", data)
로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다, 파라미터값만 넘기기때문에 앞과 같은 연산은 발생하지 않는다.
로그 사용의 장점
- 추가 정보 : 로그 메시지에 클래스 이름, 쓰레드 정보 등을 포함할 수 있다.
- 유연성 : 개발 단계에서 DEBUG 로그를, 운영 단계에서는 INFO 로그를 출력하여 상황에 맞게 조절할 수 있다.
- 다양한 출력 위치 : 로그를 콘솔뿐만 아니라 파일이나 네트워크 등에도 저장할 수 있어, 파일로 저장할 때 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
- 성능 : System.out.println보다 뛰어난 성능(내부 버퍼링, 멀티 쓰레드 등)을 가지고있다.
Core Features
Spring Boot uses Commons Logging for all internal logging but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging, Log4j2, and Logback. In each case, loggers are pre-configured to use console output with
docs.spring.io
'Spring > Spring MVC - 활용' 카테고리의 다른 글
[Spirng] Cookie, Session(쿠키, 세션) (0) | 2023.09.08 |
---|---|
[Spirng] Bean Vaildation(빈 밸리데이션) - 검증 (0) | 2023.09.07 |
[Spring] Validation(밸리데이션) - 검증 (0) | 2023.09.06 |
메시지, 국제화 (0) | 2023.09.03 |
스프링 MVC - 기본 기능 (0) | 2023.08.30 |