https://docs.python.org/3/tutorial/stdlib2.html#logging

기본 사용

  • logging은 표준 라이브러리의 통합 로그 시스템입니다.
  • 기본 상태에서 WARNING 이상만 stderr로 출력되며 DEBUG/INFO는 숨겨집니다.

예시 코드

import logging
 
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found','server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')

예시 출력

WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down

설정 확장

  • 핸들러 다양화
    • 레벨에 맞춰 다른 채널로 보낼 수 있다.
import logging
from logging.handlers import SMTPHandler
 
logger = logging.getLogger('notif')
logger.setLevel(logging.DEBUG)
 
console = logging.StreamHandler()          # 경고 이상 메시지를 콘솔로만 출력
console.setLevel(logging.WARNING)
logger.addHandler(console)
 
critical_mail = SMTPHandler(               # 치명적 오류를 이메일로 전송
  mailhost=('smtp.example.com', 25),
  fromaddr='alerts@example.com',
  toaddrs=['ops@example.com'],
  subject='Critical alert')
critical_mail.setLevel(logging.CRITICAL)
logger.addHandler(critical_mail)
 
logger.warning('경고는 콘솔로만 간다')
logger.critical('치명적 오류는 콘솔+이메일 발송')
  • 필터링 제어
    • logging.Filter('app.db')처럼 로거 이름이나 레벨을 기준으로 특정 메시지만 통과시키는 필터를 부착해, 같은 메시지도 여러 채널에 선택적으로 흘려 보낼 수 있다.
# 특정 로거(app.db)만 파일로 저장하도록 필터를 거는 예
import logging
 
logger = logging.getLogger('app.db')
file_handler = logging.FileHandler('db.log')       # db 관련 메시지를 파일로
file_handler.addFilter(logging.Filter('app.db'))   #app.db 로거만 통과
logger.addHandler(file_handler)
 
logger.warning('DB 관련 메시지만 db.log에 저장')
logging.getLogger('app.http').warning('이 메시지는 필터 때문에 버려짐')
  • dictConfig/설정 파일
  • 로깅 구성을 딕셔너리 형태로 정의해 logging.config.dictConfig()로 적용 하여 템플릿 처럼 사용 가능
# dictConfig로 콘솔/파일 핸들러 설정을 외부화하는 예
import logging, logging.config
 
cfg = {
  'version': 1,
  'handlers': {
	  'console': {'class': 'logging.StreamHandler',
'level': 'INFO'},
	  'errors': {'class': 'logging.FileHandler',  # 오류는 파일에도 기록
				 'level': 'ERROR', 'filename':
'errors.log'}
  },
  'loggers': {
	  'app': {'level': 'DEBUG', 'handlers': ['console',
'errors']}
  }
}
logging.config.dictConfig(cfg)              # 설정 딕셔너리를 한 번에 적용
 
logger = logging.getLogger('app')
logger.info('INFO는 콘솔만')                # INFO → 콘솔
logger.error('ERROR는 콘솔+errors.log')     # ERROR → 콘솔+파일

← python 3.14으로