Notice
suyeonme
[Spring Boot] 로그(Log) 본문
로그를 남기는 이유
- 운영환경에서 어플리케이션에서 문제가 발생한 경우 원인 파악을 하기 위해서는 문제가 발생했을 당시의 정보가 필요하다. 따라서 Exception이 발생했거나, 중요 기능이 실행되는 부분에서는 로그를 남긴다.
- 로그는 재현하기 힘든 버그에 대한 정보를 제공한다.
- 로그는 성능에 관한 통계와 정보를 제공한다.
로그 사용시 장점
- 쓰레드 정보, 클래스 이름등 부가 정보를 출력할 수 있고 출력 포맷을 조정할 수 있다.
- 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력, 운영 서버에서는 특정 레벨 이상의 로그만 출력하는등의 조절을 할 수 있다.
- 시스템 아웃 콘솔에 출력 및 파일이나 네트워크등 별도의 위치에 로그를 남길 수 있다.(파일 분할, 파일 압축등)
- 내부 버퍼링, 멀티스레드등 측면에서 성능이 System.out보다 좋다.
로그 라이브러리
log4j --> logback --> log4j2 순서대로 등장하였다.
SLF4J(Simple Log Facade for Java)는 수많은 라이브러리를 통합하여 인터페이스로 제공하는 라이브러리이다. 즉 slf4j는 인터페이스, logback, log4j2는 구현체 라이브러리이다.
- log4j (2015년 개발 중단)
- logback: 스프링부트에서 기본으로 사용
- log4j2: 가장 최신 라이브러리 (권장)
로그 레벨
레벨 | 설명 |
FATAL | |
ERROR | 오류를 핸들링하는 시점에 사용 |
WARN | 동작에는 문제없지만 문제가 발생 가능한 경우 |
INFO | 서비스, 도메인의 시나리오 상태, 지표등 메타 정보 기록 |
DEBUG | 개발시 디버깅 용도 |
로그 작성 예시
BAD
- log.debug(”data=” + data);
- 문자 더하기 연산 발생(레벨이 낮아서 로깅하지 않는 경우에도)
GOOD
- log.debug(”data={}”, data);
- 파라미터로 넘겨서 출력하기 때문에 연산이 발생하지 않음
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class LogController {
private final Logger log = LoggerFactory.getLogger(getClass());
public String logging() {
log.trace("info log={}", name);
log.debug("info log={}", name);
log.info("info log={}", name);
log.warn("info log={}", name);
log.error("info log={}", name);
}
}
롬복의 @Slf4j 어노테이션 사용
롬복에서 제공하는 @Slf4j 어노테이션을 사용하면 위 코드를 아래와 같이 간결하게 사용할 수 있다.
@Slf4j
@RestController
public class LogController {
public String logging() {
log.info("info log={}", name);
}
}
프로젝트/패키지별 로그 레벨 설정
application.properties파일에 아래와 같이 작성하면 프로젝트에서 발생하는 로그의 레벨에 따라서 로깅 여부를 지정할 수 있다.
예를 들어, WARN으로 레벨을 지정하면 WARN 이상인 로그가 발생했을 때에만 로깅을 한다.
- 개발기: debug
- 운영기: info
// 전체 로그 레벨 설정(기본 info)
logging.level.root=info
// hello.springmvc 패키지와 그 하위 로그 레벨
logging.level.hello.springmvc=trace // 로그 전체 레벨
logging.level.hello.springmvc=warn // WARN과 그 이상 레벨
IntelliJ 플러그인
'프로그래밍👩🏻💻 > Spring' 카테고리의 다른 글
[Spring Boot] @ControllerAdvice, @ExceptionHandler로 Exception Handling하기 (0) | 2023.01.10 |
---|---|
[Spring] @Valid로 객체의 유효성 검사하기 (0) | 2023.01.09 |
[Spring] Bean Scope 종류 (0) | 2022.06.05 |
[Spring] Controller의 요청/응답 관련 애노테이션 (0) | 2022.06.05 |
[Spring] Dependency Injection(DI), Dependency Lookup(DL)이란? (0) | 2022.06.05 |
Comments