🤔 로그를 왜 사용해야 할까?
로깅은 시스템에서 발생한 사건을 기록하는 것으로 로그는 유지보수에 있어 블랙박스와도 같다.
시스템 오류의 문제와 원인을 찾거나 사용자의 행동을 분석할 수 있는 등 로그 데이터의 역할은 생각보다 중요하다.
프로젝트 단위가 작은 경우 로깅 작업을 생략하는 경우도 있지만, 프로젝트 유지보수를 위해 꼭 필요한 작업이니 앞으로는 표준 이출력 대신 로깅을 잘 사용하도록 하자.
Spring은 다양한 로깅 프레임워크와 통합을 허용하므로 로그 메세지를 기록하고 관리할 수 있다.
Spring에서 주로 사용되는 로깅 프레임워크는 Log4j, Logback, slf4j등이 있다.
로그 레벨 | 설명 |
---|---|
TRACE | 매우 상세한 디버깅 정보 제공 |
DEBUG | 디버그용 메세지, 주로 개발/테스트 단계에서 사용하며 프로덕션 환경에서 비활성화할 수 있다. |
INFO | 정보성 메세지,Spring에서 default설정 |
WARN | 경고 메세지, 잠재적 문제나 예외 상황 |
ERROR | 심각한 오류 메세지 |
😮 환경(Env)에 따라 로그 출력을 구분하는 것이 좋다고 한다.
상세한 로그 순서 먼저 나열
Local (로컬) - TRACE
Dev (개발) - DEBUG
Test (테스트) - INFO
Prod (운영) - WARN|ERROR
resources/log4j.xml
파일 내에서 logger의 level을 설정할 수 있다. <logger name="com.ssafy.car">
<level value="info" />
</logger>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
logger.debug("로그 debug");
logger.info("로그 info");
logger.warn("로그 warn");
<level value="info" />
로 설정하면 info, warn레벨의 log가 출력되고
<level value="debug" />
로 설정하면 debug, info, warn레벨의 log가 출력된다.
@ControllerAdvice
public class ExceptionController {
private Logger logger = LoggerFactory.getLogger(ExceptionController.class);
// 구체적인 클래스 먼저 실행된다
@ExceptionHandler(SQLException.class) // controller를 실행하다가 Exception이 발생하면 무조건 여기로 넘어옴
public String sqlException(Exception e) {
logger.debug(" SQL 에러 메세지: {}",e.getMessage());
return "error/500error";
}
@ExceptionHandler(Exception.class)
public String allException(Exception e) {
logger.debug("에러 메세지: {}",e.getMessage());
return "error/500error";
}
}
Controller 에러 발생 시 처리 순서
1. 해당 Controller의 @ExceptionHandler가 처리
2. @ControllerAdvice(전역 예외 처리 컨트롤러)의 @ExceptionHanler가 처리
3. 그냥 500에러 반환