[Spring] 운영 환경에서의 로그 모니터링 레벨 구분
모든 시스템은 추적을 위해 로깅이 필요하다.
일반적으로 개발 환경에서는 DEBUG, 운영 환경에서는 INFO 레벨로 사용한다.
로그 레벨
TRACE > DEBUG > INFO > WARN > ERROR > FATAL
로그 레벨 설정 시 TRACE로 설정하면 TRACE 이상 등급의 모든 로그 표시, INFO 설정 시 INFO 이상 로그가 출력된다.
- TRACE : 모든 레벨에 대한 로그 추적
- DEBUG : 개발 단계에서 사용, 주로 SQL 확인
- INFO : 운영에 참고될 수 있는 데이터나 애플리케이션 흐름 확인
- WARN : 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리
- ERROR : 예상하지 못한 심각한 문제가 발생하는 경우
로그 포맷
# Logback 포맷
14:18:17.635 [Name Of Thread] INFO c.e.NameOfLogger - Log message
# java.util.logging 포맷
July 29, 2022 2:36:11 PM com.exmaple.NameOfLogger nameOfMethod
INFO : Log message
# Log4j 포맷
2022-07-29 11:36:02,651 [Name Of Thread] INFO com.example.NameOfLogger - message
java.util.logging은 성능이 가장 나쁘고, Logback이 제일 빠르다고 함.
GitHub - stephenc/java-logging-benchmarks: JMH based benchmarks of different Java Logging frameworks
JMH based benchmarks of different Java Logging frameworks - stephenc/java-logging-benchmarks
github.com
TRACE
가장 상세한 로그 레벨로, 실행 흐름과 디버깅 정보를 상세히 기록하여 디버깅 과정에서 사용한다.
DEBUG
개발 혹은 테스트 단계에서 해당 기능이 올바르게 동작하는지 확인하기 위한 로그 레벨이다.
- DB 연결, SQL 쿼리, 함수 호출에 사용된 인자, 반환 값 등을 남겨 문제 추적 및 해결에 도움을 준다.
- 애플리케이션의 내부 동작을 이해하고 문제를 분석하기 위해 사용!
인텔리제이같은 IDE의 디버거 성능이 좋아지면서 로컬 개발 단계에서 DEBUG 단계 로깅을 활용할 일이 잘 없지만, DEV/QA 환경에서의 문제를 파악할 때 사용하면 좋다.
- 개발 환경에서만 사용하며, 운영 환경에서 남기고 싶지 않은 로그 메시지를 기록한다.
INFO
정보성 메시지로 애플리케이션의 정상 작동 정보, 일의 발생을 나타내는 표준 로그 레벨이다.
- 주요 이벤트나 실행 상태, 외부 리소스와의 상호 작용 등에 대한 정보를 전달한다.
- 인증 API의 백엔드에서 인증 성공 여부에 따라 사용자가 인증을 요청한 정보 등을 INFO 로그로 남김
- 애플리케이션의 시작/종료 시점, 중요한 작업(배치 등)의 실행/완료 시점 등을 INFO 로그로 남김
- 운영 환경에서도 사용 가능하며, 시스템을 파악하는 데 유익한 정보만 남겨야 한다.
WARN
애플리케이션에서 잠재적으로 문제가 될 수 있는 상황일 때 남기는 로그 레벨로, 사용자의 오입력으로 인한 오류 발생 등 언제든 발생할 수 있는, 예측 가능한 일반적인 문제 상황에 주로 사용한다.
- 유효하지 않은 입력, 예상치 못한 입력, 리소스 제한 등 사용자 측면의 오류를 WARN 로그로 남김
- 운영 환경에서도 사용 가능하며, 개발자가 조치를 취할 수 있도록 주의를 기울일 필요가 있는 상황을 나타냄
ERROR
애플리케이션에서 발생한 심각한 오류나 예외 상황을 나타내는 로그 레벨로, 기능 자체가 제대로 작동하지 못하는 문제일 때, 즉시 조치가 필요한 상황일 때 사용한다.
- 운영 환경에서도 사용 가능하며, DB 연결 실패 등 즉시 조치해야 하는 문제에 사용한다.
- WARN 상황에서 특정 기준치를 넘기는 경우 ERROR로 변경하여 WARN-ERROR를 구분하는 것도 좋다.
[주의]
로그 출력 레벨이 INFO 이상인 경우, DEBUG 로그는 출력되지 않으나 아래 예시에서 +를 사용하면 실제로는 문자열 더하기 연산이 실행된다고 한다. {}를 사용하여야 불필요한 연산이 발생하지 않게 됨
# 연산 발생
log.debug("data = " + data)
# 연산 미발생
log.debug("data={}", data)