로깅(Logging)

정의
- 소프트웨어 시스템에서 발생하는 모든 행위와 이벤트 정보를 시간 순서대로 기록하는 작업
 - 로그 : 소프트웨어 시스템에서 발생하는 모든 행위와 이벤트 정보
 
목적
| 목적 | 설명 | 
|---|---|
| 디버깅 및 문제 진단 | 프로그램 실행 중 발생하는 오류나 예외 상황에 대해 원인을 추적하고 해결하는 데 필요한 정보 확보 | 
| 시스템 모니터링 | 시스템의 정상적인 동작 상태, 문제 상황을 실시간으로 파악해 선제 조치할 수 있게 함 | 
| 감사 및 추적 | 사용자의 활동, 중요한 비즈니스 로직의 완료 시점 등 보안 감사나 추적에 필요한 기록 남김 | 
로깅의 기본 요소
(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