스프링 부트는 로깅 퍼사드(logging facade) SLF4J(Simple Logging Facade for Java)와 구현체 Logback을 기본으로 쓴다. 코드는 SLF4J API로 로그를 남기고, 어떤 레벨을 어디에 어떤 형식으로 쓸지는 설정으로 정한다.
레벨
| 레벨 | 용도 |
|---|---|
| ERROR | 요청 실패 등 즉시 봐야 할 문제 |
| WARN | 동작은 하지만 이상한 상황 |
| INFO | 시작·종료·주요 업무 이벤트 (기본) |
| DEBUG | 개발 중 진단 정보 |
| TRACE | 아주 세밀한 흐름 |
설정한 레벨과 그보다 심각한 레벨만 출력된다. 기본은 INFO라 DEBUG·TRACE는 나오지 않는다. FATAL은 Logback에 없고 ERROR로 다룬다.
설정
logging:
level:
root: INFO
com.example.order: DEBUG
org.hibernate.SQL: DEBUG # 실행되는 SQL 보기
group:
web: org.springframework.web, org.springframework.security- 패키지별, 그룹별로 레벨을 다르게 준다.
debug=true는 스프링 내부 로거 일부만 DEBUG로 올린다 - 기본은 콘솔 출력만 한다. 파일은
logging.file.name이나logback-spring.xml에서 롤링 정책(rolling policy: 날짜·크기별 분할, 보관 개수)을 정한다 - 운영에서는 사람이 읽는 형식보다 JSON 구조화 로그(structured logging)가 수집·검색에 유리하다
코드에서
@Slf4j // Lombok: private static final Logger log 생성
public class OrderService {
void pay(Order o) {
log.info("결제 요청 orderId={}", o.getId()); // 문자열 결합 대신 {} 자리표시자
log.debug("상세 {}", o); // DEBUG가 꺼져 있으면 toString 호출 안 함
}
}{}자리표시자(placeholder)는 레벨이 꺼져 있으면 문자열을 만들지 않는다- 예외는 마지막 인자로 넘겨야 스택 트레이스(stack trace)가 남는다:
log.error("실패 orderId={}", id, e) - 비밀번호·토큰·개인정보는 로그에 남기지 않는다
예외를 잡고 로그만 남긴 채 넘어가는 실수는 예외 삼키기, 디버깅에서 로그의 역할은 디버깅 포켓 가이드 (개요)을 본다. @Slf4j는 Lombok이 만든다.
출처: Spring Boot 문서: Log Levels · Log Groups · File Rotation · Structured Logging