表題のとおり、Pythonログ作成を行うモジュールを作成してもらいました。
プロンプト内容は以下のとおりです。
Pythonのログ出力に便利な機能を詰め込んだlog.pyを独自に作成してください。
可読性、保守性、拡張性に優れたモジュールとしてください。
以下、GPT-4oの応答です。
こちらに、Pythonのロギングを効率的に行うためのlog.py
モジュールを提案します。このモジュールは、可読性、保守性、拡張性を重視し、複数の機能を備えた構成です。
# log.py
import logging
import os
from logging.handlers import TimedRotatingFileHandler
from typing import Optional
class LogConfig:
"""Logger configuration class to encapsulate logging settings."""
def __init__(self,
log_level: int = logging.DEBUG,
log_dir: str = "logs",
log_file: str = "app.log",
console_output: bool = True):
self.log_level = log_level
self.log_dir = log_dir
self.log_file = log_file
self.console_output = console_output
class Logger:
"""A custom logger class that supports file rotation and optional console output."""
def __init__(self, name: Optional[str] = None, config: Optional[LogConfig] = None):
self.config = config or LogConfig()
self.logger = logging.getLogger(name or __name__)
self.logger.setLevel(self.config.log_level)
self._setup_logger()
def _setup_logger(self):
# Ensure the log directory exists
os.makedirs(self.config.log_dir, exist_ok=True)
# Create file handler with timed rotation
file_handler = TimedRotatingFileHandler(
filename=os.path.join(self.config.log_dir, self.config.log_file),
when="midnight",
interval=1,
backupCount=7, # keep logs for the last 7 days
encoding="utf-8"
)
file_handler.setLevel(self.config.log_level)
file_handler.setFormatter(self._get_formatter())
self.logger.addHandler(file_handler)
# Optionally add console handler
if self.config.console_output:
console_handler = logging.StreamHandler()
console_handler.setLevel(self.config.log_level)
console_handler.setFormatter(self._get_formatter())
self.logger.addHandler(console_handler)
def _get_formatter(self) -> logging.Formatter:
"""Return a standard logging format."""
return logging.Formatter(
fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
def debug(self, message: str):
"""Log a debug message."""
self.logger.debug(message)
def info(self, message: str):
"""Log an info message."""
self.logger.info(message)
def warning(self, message: str):
"""Log a warning message."""
self.logger.warning(message)
def error(self, message: str):
"""Log an error message."""
self.logger.error(message)
def critical(self, message: str):
"""Log a critical message."""
self.logger.critical(message)
def exception(self, message: str):
"""Log an exception with traceback."""
self.logger.exception(message)
# Usage example:
# config = LogConfig(log_level=logging.INFO, console_output=True)
# log = Logger(name="my_app", config=config)
# log.info("This is an informational message.")
# log.error("This is an error message.")
モジュールのポイント
- 設定管理:
LogConfig
クラスで、ロギング設定を一元管理。 - ファイルローテーション: 日次ローテーション(バックアップ保持期間は7日間)で、アプリケーションの長期間実行に対応。
- コンソール出力のオプション: 開発時と本番環境で異なる設定が容易。
- 例外ログ:
exception()
メソッドでトレースバックを含むエラーログの記録が可能。 - エラーハンドリング: レベル別メソッドを使用し、エラーレベルに応じた適切なログ出力。
拡張性と保守性
LogConfig
を使用することで、設定をクラス内で一元管理し、他のコードに変更を加えることなく設定の変更が容易。TimedRotatingFileHandler
を使ってファイルローテーションを設定しており、バックアップ期間などを柔軟に変更できます。- 将来的にログの出力先(クラウドやデータベースなど)を追加する際も、新しいハンドラを
self.logger.addHandler()
で追加可能。