파이썬 - 로깅

안녕하세요, 파이썬 프로그래머를 꿈꾸는 여러분! 오늘은 파이썬에서의 로깅의 놀라운 세계에 빠지러 갈 거예요. 친절한 이웃 컴퓨터 교사로서, 여러분을 이 여정을 안내하는 것을 기대하고 있어요. 믿어주세요, 이 튜토리얼을 끝내면 여러분은 프로처럼 로깅을 할 수 있을 거예요!

Python - Logging

파이썬에서의 로깅

형사로서 미스터리를 해결하려고 하는 것을 상상해봐요. 찾은 모든 단서를 기록하고 싶지 않은가요? 그렇다면 로깅은 프로그래밍에서 정확히 그런 일을 해줍니다! 로깅은 우리의 코드가 실행될 때 무슨 일이 일어나고 있는지 추적하는 데 도움을 줍니다.

파이썬은 내장된 logging 모듈을 통해 이 과정을 매우 쉽게 만들어줍니다. 중요한 정보를 자동으로 기록해주는 신뢰할 수 있는 노트북을 가지고 있는 것과 같아요.

로깅의 이점

이제, "print 문을 사용할 수 있기 때문에 로깅을 왜 해야 하나요?"라고 궁금해할 수도 있습니다. ع非좋은 질문이에요! 제 초기 코딩 시절의 이야기를 조금만 이야기해볼게요.

한 번은 print 문을 사용하여 프로그램 디버깅을 수시간 동안 했어요. 아, 그건 허탈한 중에 더러운 더러움을 찾는 것과 같았어요! 그런때 로깅의 마법을 발견했어요. 다음은 몇 가지 이점들입니다:

  1. 靑소성: print 문과는 달리, 로그는 코드를 수정하지 않고 쉽게 켜고 끄 수 있습니다.
  2. 심각도 수준: 로그를 중요성에 따라 범주화할 수 있습니다.
  3. 출력 제어: 로그는 파일, 콘솔, 심지어 원격 서버로도 방향성할 수 있습니다!
  4. 성능: 로깅은 print 문보다 성능에 덜 영향을 미칩니다.

파이썬 로깅의 구성 요소

파이썬 로깅의 주요 구성 요소를 살펴보겠습니다:

  1. 로거: 로깅 시스템에 접근하는 엔트리 포인트입니다.
  2. 핸들러: 로그 레코드를 적절한 목적지로 보냅니다.
  3. 포매터: 최종 출력에서 로그 레코드의 레이아웃을 지정합니다.
  4. 필터: 출력할 로그 레코드에 대한 추가적인 제어를 제공합니다.

공장의 조립라인을 생각해보세요. 로거는 문제를 발견하는 작업자, 핸들러는 보고서를 어디로 보낼지 결정하는 것, 포매터는 보고서가 어떻게 보일지 결정하는 것, 필터는 어느 보고서가 충분히 중요한지 결정하는 것입니다.

로깅 수준

파이썬 로깅은 다섯 가지 표준 심각도 수준을 제공합니다. 편리한 표로 살펴보겠습니다:

수준 숫자 값 설명
DEBUG 10 디테일한 정보, 보통 문제 진단할 때만 관심이 있을 때 사용.
INFO 20 예상대로 작동하는 것을 확인하는 정보.
WARNING 30 예상치 못한 일이 발생했거나, 장기 미래의 문제를 암시하는 것.
ERROR 40 더 심각한 문제로 인해 소프트웨어가 어떤 기능을 수행하지 못했습니다.
CRITICAL 50 프로그램 자체가 계속 실행되지 못할 수 있는 심각한 오류.

기본 로깅 예제

간단한 예제로 발판에 올라보겠습니다:

import logging

# 기본 로깅 설정
logging.basicConfig(level=logging.INFO)

# 로거 생성
logger = logging.getLogger(__name__)

# 메시지 로그
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

이 코드를 실행하면 다음과 비슷한 출력이 나올 것입니다:

INFO:__main__:This is an info message
WARNING:__main__:This is a warning message
ERROR:__main__:This is an error message
CRITICAL:__main__:This is a critical message

디버그 메시지가 나타나지 않는 것을 알겠죠? 그是因为 기본 설정 수준을 INFO로 지정했기 때문입니다. INFO보다 낮은 것(예: DEBUG)은 설정을 변경하지 않는 이상 로그에 기록되지 않습니다.

로깅 설정

이제 로깅 설정을 좀 더 정교하게 하겠습니다:

import logging

# 로깅 설정
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
logger.critical("Critical message")

이 예제에서는 다음을 설정했습니다:

  1. 로깅 수준을 DEBUG으로 설정
  2. 로그 메시지의 형식을 지정
  3. 출력을 'app.log' 파일로 보냈습니다

'app.log' 파일을 확인하면 시간스탬프가 포함된 멋진 형식의 로그 메시지를 볼 수 있습니다!

로깅 핸들러

핸들러는 로깅 세계에서 우편 서비스 같은 존재입니다. 로그 메시지가 어디로 도착할지 결정합니다. 여러 핸들러를 사용하는 예제를 살펴보겠습니다:

import logging

# 로거 생성
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 핸들러 생성
c_handler = logging.StreamHandler()  # 콘솔 핸들러
f_handler = logging.FileHandler('file.log')  # 파일 핸들러
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# 포매터 생성 및 핸들러에 추가
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# 핸들러를 로거에 추가
logger.addHandler(c_handler)
logger.addHandler(f_handler)

# 로거 테스트
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

이 예제에서는 두 개의 핸들러를 설정했습니다:

  1. 콘솔 핸들러는 WARNING 이상을 콘솔에 출력합니다.
  2. 파일 핸들러는 ERROR 이상을 파일에 로그합니다.

이 코드를 실행하면 콘솔에 WARNING 이상이 출력되고, 파일에는 ERROR와 CRITICAL 메시지만 저장됩니다.

그리고 이렇게 하면 됩니다, 여러분! 파이썬 로깅의 세계에 첫 걸음을 내딛었어요. 기억해요, 연습이 쌓이면 완벽해집니다. 여러분의 프로젝트에 가장 잘 맞는 다양한 구성을 실험해보세요.

신나게 로깅하고, 여러분의 코드가 항상 버그 없이 되시길 바랍니다!

Credits: Image by storyset