2016-09-02 1 views
2

ユーザーセッションをログに記録したい。現在のコードは次のようである(設定フォーマッタとハンドラが省略されている):ログインするには、いくつかのメッセージがある場合すべてのメッセージではなく、ロガーにカスタム値を渡す

logger = logging.getLogger("component") 
logger.info("message", extra={"session": 123}) 
logger.debug("debug", extra={"session": 123}) 

、それはこの追加情報を毎回送信する迷惑なんです。私はロガーとオーバーライドログメソッドを拡張すると考えることができ

logger = logging.getLogger("component") 
# for example: 
logger.addExtra({"session": 123}) 
logger.info("message") # extra would be added automatically 
logger.debug("debug") # extra would be added automatically 

:何がそのような何かを達成するために/クリーン/最も神託の方法がベストです。その

def get_logger_with_context(name, context=None): 
    extra = context or {} 
    logger = logging.getLogger(name) 

    def log(level, message, **kwargs): 
     getattr(logger, level)(message, extra=context) 

    return log 

答えて

3

@DhruvPathakが指定されているようLoggerAdapterを作成します。 LoggerAdapters signatureによると:

class logging.LoggerAdapter(logger, extra) 

あなたは初期化時に、あなたのロガーのインスタンスとextra引数を提供することにより、それを行う:

logger = logging.LoggerAdapter(logger, extra) 
+0

これはシンプルでクールなようです。具体的なコード例をありがとう。 – Ago

1

利用機能工場ロギング動作を変更logging.loggerAdaptersを使用して、Pythonのログ出力クラスで実現可能です。

ロギングイベント情報とともに出力 するコンテキスト情報を渡すことのできる簡単な方法はLoggerAdapter クラスを使用することです。このクラスはLoggerのように設計されているため、 はdebug()、info()、warning()、error()、exception()、critical()および log()を呼び出すことができます。これらのメソッドは、 Loggerの対応するシグネチャと同じシグネチャを持つため、2つのタイプのインスタンスを同じ意味で使用できます。

0

Python logging docを参照してください:LogAdapterの横に、あなたもLogFilterを使用することができます。

私は通常、すべてのロガーに影響を及ぼすため、MDCを使用します。残念ながら、PythonロギングにはMDCがありません。私はちょうどmdaniel's MDC gistを見つけました。

関連する問題