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
関数はアプリケーションの起動時に一度だけ呼び出し、その後はアプリケーション全体で一貫したログ設定を適用する想定で書かれています。