Python Logging 설정
콘솔 출력, 파일 저장, 그리고 구조화된 로그 분석을 위한 JSON 포맷팅을 지원하는 Python 로깅 설정 템플릿입니다.
import logging
import logging.config
import json
import sys
from datetime import datetime
class JsonFormatter(logging.Formatter):
"""로그를 JSON 형식으로 변환하는 포맷터입니다."""
def format(self, record):
log_record = {
"timestamp": self.formatTime(record, self.datefmt),
"level": record.levelname,
"logger": record.name,
"message": record.getMessage(),
"module": record.module,
"line": record.lineno,
}
if record.exc_info:
log_record["exception"] = self.formatException(record.exc_info)
return json.dumps(log_record)
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
},
"json": {
"()": JsonFormatter,
"datefmt": "%Y-%m-%dT%H:%M:%S"
},
},
"handlers": {
"console": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "standard",
"stream": sys.stdout,
},
"file": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"formatter": "json",
"filename": "app.log",
"maxBytes": 10485760, # 10MB
"backupCount": 5,
"encoding": "utf8",
},
},
"loggers": {
"": { # root logger
"handlers": ["console", "file"],
"level": "DEBUG",
"propagate": True,
},
"uvicorn.error": {
"level": "INFO",
},
"uvicorn.access": {
"handlers": ["console"],
"level": "INFO",
"propagate": False,
},
},
}
def setup_logging():
logging.config.dictConfig(LOGGING_CONFIG)
if __name__ == "__main__":
setup_logging()
logger = logging.getLogger("my_app")
logger.info("Application started")
logger.debug("Debugging database connection")
try:
1 / 0
except Exception:
logger.exception("An error occurred during calculation")