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 → 콘솔+파일