로깅(Logging)

alt text

정의

  • 소프트웨어 시스템에서 발생하는 모든 행위와 이벤트 정보를 시간 순서대로 기록하는 작업
  • 로그 : 소프트웨어 시스템에서 발생하는 모든 행위와 이벤트 정보

목적

목적 설명
디버깅 및 문제 진단 프로그램 실행 중 발생하는 오류나 예외 상황에 대해 원인을 추적하고 해결하는 데 필요한 정보 확보
시스템 모니터링 시스템의 정상적인 동작 상태, 문제 상황을 실시간으로 파악해 선제 조치할 수 있게 함
감사 및 추적 사용자의 활동, 중요한 비즈니스 로직의 완료 시점 등 보안 감사나 추적에 필요한 기록 남김

로깅의 기본 요소

(1) 로그 메시지

1
[ERROR] 2025-11-03 20:18:09 [abc.py] line 03 - There is no define of "ABC" function
  • 로깅 되는 이벤트에 대한 정보, 그리고 관련된 메타데이터를 지칭한다.
  • 가장 중요한 로깅의 기본 요소, 핵심 요소이다.

(2) 로그 핸들러

1
2
3
4
5
6
7
8
9
10
log_message = "some log message"

def file_handler(message):
    log_to_file(message)

def stream_handler(message):
    sys.stderr.write(message)

def email_handler(message):
    send_to_emain(message)
  • 로그 메시지를 가지고 “무언가를” 하는 로직
  • 예를 들어, 로그 메시지를 어떤 파일에 저장한다거나, 콘솔에 출력한다거나, 이메일로 보내는 등의 작업을 수행한다.
  • 이들을 각각 파일 핸들러, 스트림 핸들러, 이메일 핸들러 등의 이름으로 부르기도 한다.

(3) 로그 레벨

레벨 설명 심각도
DEBUG 디버깅에 유용한 상세 정보
- 상세한 실행 흐름
- 내부 변수 값 출력 등
매우 낮음
INFO 정보성 메시지
- 운영 상태, 주요 이벤트, 주요 비즈니스 로직의 완료
낮음
WARNING 잠재적인 문제 발생 가능성. 오류는 아니지만 주의가 필요한 상황
- 설정 파일 없음
- 리소스 고갈 임박
중간
ERROR 로직이 정상적으로 작동하지 못한 경우. 즉각적인 조치가 필요함. 높음
  • 로그 레벨이란, 로그의 “중요도” 또는 “심각도” 를 수치적 또는 순서성으로 나타낸 것을 의미한다.
  • 로그 레벨이 필요한 이유는, 각각의 환경에 따라 필요한 정보의 양이 다르기 때문에, 이를 구분하는 필터 역할을 하기 위함이다.
  • 예를 들어 개발 단계에서는, 디버깅을 하기 위해 최대한 상세하게 로깅되는 것이 좋다.
  • 반대로 운영 환경에서는, 에러나 중요한 결과값만을 기록해서 효율적인 저장공간 운영을 하는 것이 좋다.
  • 위 표와 같은 구분법을 보통 많이 사용하며, 환경에 맞춰 로그 레벨을 정의해서 사용해도 된다.

왜 print 대신 logging을 해야할까?

  • 표준 출력(print) 은 아래와 같은 한계가 있다.
  • 성능 문제 : print 는 I/O작업 시 동기화 문제로 인해, 트래픽이 많을 때에는 성능 부하를 일으킬 수 있다.
  • 유연성 부족 : print 는 로그 레벨, 다양한 출력(콘솔, 파일 등)과 같은 유연한 사용이 어렵다.

여러 개발언어에서의 로깅 라이브러리

언어 표준/내장 라이브러리 서드파티 라이브러리
Java java.util.logging - SLF4J
- Logback
- Log4j2
Python logging - Loguru
- Structlog
Go log - Zap
- Logrus
- Zerolog
Rust 없음 - log
- env_logger
- fern
- tracing
Node.js console - Winston
- Pino
- Bunyan

Reference

https://docs.python.org/3/library/logging.html
https://docs.python.org/ko/3/howto/logging.html

Comments