[CS] Logging Level
로그 레벨(Log level)이란?
- 로그 레벨(Log Level)은 로그 메시지의 중요도를 나타내는 수준을 의미한다.
- 로그 레벨은 로깅 시스템에서 사용되며, 로그 메시지의 중요도에 따라 해당 메시지를 기록할지 결정하는 데 사용된다.
로그레벨
1) TRACE
- 가장 상세한 로그 레벨로, 애플리케이션의 실행 흐름과 디버깅 정보를 상세히 기록한다. 주로 디버깅 시에 사용된다.
2) DEBUG
- 디버깅 목적으로 사용되며, 개발 단계에서 상세한 정보를 기록한다.
- 애플리케이션의 내부 동작을 이해하고 문제를 분석하는 데 도움을 준다.
3) INFO
- 정보성 메시지를 기록한다.
- 애플리케이션의 주요 이벤트나 실행 상태에 대한 정보를 전달한다.
4) WARN
- 경고성 메시지를 기록한다.
- 예상치 못한 문제나 잠재적인 오류 상황을 알리는 메시지이다.
- 애플리케이션이 정상적으로 동작하지만 주의가 필요한 상황을 알려준다.
5) ERROR
- 오류 메시지를 기록한다.
- 심각한 문제 또는 예외 상황을 나타내며, 애플리케이션의 정상적인 동작에 영향을 미칠 수 있는 문제를 알린다.
6) FATAL
- 가장 심각한 오류 메시지를 기록한다.
- 애플리케이션의 동작을 중단시킬 수 있는 치명적인 오류를 나타낸다.
- 일반적으로 이러한 오류는 복구가 불가능하거나 매우 어려운 상황을 의미한다.
중요한 것은 논리적 이유와 일관성
위의 상황에 어떤 로그 레벨을 사용할지 생각해보기 위해 더 많은 상황에 대한 정보를 알아보자. 프론트엔드에서 요청을 보내기전에 입력 값을 검증 한다면, 어느 정도는 검증된 입력이 백엔드 API에 들어올 것이다. 만약 잘못된 입력이 들어왔다면 다음 상황 중 하나일 수 있다.
- 프론트엔드에서 검증하지 못한 값이 있다.
- 일반적인 프론트엔드를 통한 사용법이 아니라 다른 경로로 요청이 들어오고 있다.
1번은 사람의 실수 또는 프론트와 백엔드의 소통 문제로 충분히 발생할 수 있는 상황이다. 또한 앞서 말했듯 API는 정상적으로 작동했으니 에러나 버그를 표시하기 위한 ERROR 레벨은 너무 높다고 생각한다. 2번의 경우도 충분히 발생할 수 있다. 이것이 악의적인 누군가에 의한 요청일 수도 있다. 하지만 이를 떠나서, 아무리 프론트엔드에서 입력을 검증한다고 해도 당연히 백엔드에서도 요청을 검증해야한다. 어찌됐든 잘못된 요청이 많이 들어온다면 이는 충분히 예의 주시할만하다고 생각해 정보를 표현하기 위한 INFO 레벨은 너무 높다고 생각한다. 결국 위 상황이라면 나는 WARN 레벨로 로깅을 할 것이다.
개개인 또는 프로젝트에 따라 어떤 레벨이 어떤 수준의 상황에 적합한지는 모두 다를 수 있다. 중요한 것은 레벨을 선택할때 논리적인 이유를 가지고 일관성 있게 하는 것이다. 개인 프로젝트가 아닌 이상 여러 사람이 로그를 남길 것이므로, 이에대해 구성원이 공통적인 시각을 가질 수 있도록 컨벤션을 정하는 것도 중요할 것 같다. 결국 로그는 문제가 발생했을 때 쉽게 문제의 원인을 파악하고 해결하기 위함이므로 일관성 있는 로그는 아주 중요하다.
로깅 메시지의 중요성도 잊지 말자
로그 메시지의 중요성도 잊어서는 안된다. 아무리 논리적이고 일관성있게 로깅 레벨을 정해 로그를 남겼다고 하더라도, 결국 남은 메시지가 별로 도움이 되지 않는다면 큰 의미가 없다. 디버깅에 용이하도록 충분한 정보를 남기고, 로그를 찾는데 불편함이 없도록 하나의 문제는 한줄로 남기자.
// 블로그 글을 생성하는 요청에서 잘못된 제목 값으로 예외 발생한 경우
// 도움이 덜 되는 로그
log.warn(e.getMessage())
// 조금 더 도움 되는 로그
log.warn("POST:CREATE:INVALID_TITLE. userId={}, invalidTitle={}, message={}", e.getUserId(), e.getInvalidTitle(), e.getMessage(), e)
로깅 시스템 설정하기
- 로그 레벨은 로깅 시스템의 설정을 통해 지정하며, 설정된 로그 레벨 이상의 중요도를 가진 로그 메시지만 기록된다.
- 예를 들어, 로그 레벨을 'DEBUG'로 설정하면 'TRACE'보다 중요한 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL' 로그 메시지가 기록되지만, 'TRACE' 수준의 로그는 기록되지 않는다.
- 아래는 log4j.xml의 로깅 시스템 설정 예이다.
<!-- Application Loggers -->
<logger name="edu.test.comm">
<!-- trace < debug < info < warn <error <tatal debug 이상은 모두 찍힘 -->
<level value="debug" />
<appender-ref ref="dailyRollingFile"/>
</logger>