\

Pythonでは、ログの出力先や出力内容などを設定するためにloggingモジュールが標準で備わっています。このモジュールを利用すると、ログファイル出力と標準出力を併用するケースがあります。

ログファイル出力

Pythonでロギングする際の一般的なパターンは以下の通りです。

  • ファイル出力 (全て同一ログファイルに出力する)
  • ファイル出力 (ログレベルに応じてログファイルを分ける)

以下に、ログレベルに応じてログファイルを分ける例を示します。

from logging import getLogger, Formatter, handlers, DEBUG, ERROR

class FileLogger:
    def __init__(self, debug_file='log/app.log', error_file='log/err.log'):
        self.logger = getLogger(__name__)
        self.logger.setLevel(DEBUG)
        formatter = Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s')

        # DEBUGレベルハンドラ定義
        debug_handler = handlers.RotatingFileHandler(
            filename=debug_file,
            maxBytes=1048576,
            backupCount=3
        )
        debug_handler.setFormatter(formatter)
        debug_handler.setLevel(DEBUG)
        self.logger.addHandler(debug_handler)

        # ERRORレベルハンドラ
        error_handler = handlers.RotatingFileHandler(
            filename=error_file,
            maxBytes=1048576,
            backupCount=3
        )
        error_handler.setFormatter(formatter)
        error_handler.setLevel(ERROR)
        self.logger.addHandler(error_handler)

    def debug(self, msg):
        self.logger.debug(msg)

    def info(self, msg):
        self.logger.info(msg)

    def warn(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

    def critical(self, msg):
        self.logger.critical(msg)

標準出力

標準出力のパターンは、コンテナ環境でfluentdドライバなどで外部転送したいケースがあるかなと思います。以下に、標準出力の例を示します。

from logging import getLogger, Formatter, StreamHandler, DEBUG

class StreamLogger:
    def __init__(self):
        self.logger = getLogger(__name__)
        self.logger.setLevel(DEBUG)
        formatter = Formatter('%(asctime)s %(levelname)s %(name)s: %(message)s')
        handler = StreamHandler()
        handler.setFormatter(formatter)
        handler.setLevel(DEBUG)
        self.logger.addHandler(handler)

    def debug(self, msg):
        self.logger.debug(msg)

    def info(self, msg):
        self.logger.info(msg)

    def warn(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

    def critical(self, msg):
        self.logger.critical(msg)

以上のように、Pythonのloggingモジュールを使うと、ログファイル出力と標準出力の両方を効果的に管理することができます。これにより、アプリケーションのデバッグや運用が容易になります。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です