スポンサーリンク

【Python】Loggingのフォーマットへのカスタム項目追加

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

Streamlitのログ出力でLoggingを使用していましたが、ユーザーIDをログに出力したいアプリがありました。

実装したカスタマイズ方法をメモしておきます。

まず、log_config.pyという名前のファイルを作成し、ログの設定とカスタムLogRecordクラスを定義します。このクラスでは、user_idを静的変数として保持し、ログ出力時にこの値をログメッセージに含めるようにします。

# log_config.py

import logging

class CustomLogRecord(logging.LogRecord):
    user_id = 'N/A'  # デフォルト

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_id = CustomLogRecord.user_id

def custom_record_factory(*args, **kwargs):
    return CustomLogRecord(*args, **kwargs)

def setup_logging(user_id):
    CustomLogRecord.user_id = user_id  # user_idを設定
    logging.setLogRecordFactory(custom_record_factory)
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(name)s - [%(levelname)s] - %(message)s - user_id: %(user_id)s'
                        )

この設定ファイルでは、setup_logging関数を呼び出してログを設定し、user_idを初期化します。この関数はアプリケーションの初期化時に一度だけ呼び出します。

次に、アプリケーションのメインファイルや他のモジュールでログを出力する例を示します。

# main.py

import logging
from log_config import setup_logging

# ログの設定とuser_idの設定
setup_logging(user_id='12345')

# ロガーの取得
logger = logging.getLogger(__name__)

# ログの出力
logger.info("アプリケーションを開始")
# another_module.py

import logging

# 既に設定されているロガーを使用
logger = logging.getLogger(__name__)

# ログの出力
logger.info("別のモジュールからのログ出力")

log_config.pyでログの設定とuser_idの初期化を行い、アプリケーションのどの部分からでも同じロガー設定とuser_idを使用してログ出力を行うことができます。setup_logging関数はアプリケーションの起動時に一度だけ呼び出し、その後はアプリケーション全体で一貫したログ設定を適用する想定で書かれています。

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