スポンサーリンク

【ChatGPT-4o】Pythonのロギングを効率的に行うためのモジュールを作成してもらった

記事内に広告が含まれています。

表題のとおり、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.")

モジュールのポイント

  1. 設定管理: LogConfigクラスで、ロギング設定を一元管理。
  2. ファイルローテーション: 日次ローテーション(バックアップ保持期間は7日間)で、アプリケーションの長期間実行に対応。
  3. コンソール出力のオプション: 開発時と本番環境で異なる設定が容易。
  4. 例外ログ: exception()メソッドでトレースバックを含むエラーログの記録が可能。
  5. エラーハンドリング: レベル別メソッドを使用し、エラーレベルに応じた適切なログ出力。

拡張性と保守性

  • LogConfigを使用することで、設定をクラス内で一元管理し、他のコードに変更を加えることなく設定の変更が容易。
  • TimedRotatingFileHandlerを使ってファイルローテーションを設定しており、バックアップ期間などを柔軟に変更できます。
  • 将来的にログの出力先(クラウドやデータベースなど)を追加する際も、新しいハンドラをself.logger.addHandler()で追加可能。

スポンサーリンク
Python
著者SNS
タイトルとURLをコピーしました