2017-03-31 3 views
1

私のライブラリにカスタムフォーマットフィールドを追加しようとしています。私は、これがFilterかLoggerAdapterオブジェクトで行われることを知っています。しかし、私が見た例では(このように:How do I add custom field to Python log format string?)、生成したいカスタムフィールドは静的であり、ロガーが作成されたときにわかっています。Pythonログレコードのカスタム変数フィールド

ログレコードを書き込む直前まで、本当にわからない変数を自分のログレコードに送ることができる必要があります。私は解決策を見ていないと思いますが、これをどのように達成するのがベストですか?

は現在、私はこの方法で私のロガーを設定します。

import logging 

class MyClass: 
    filehandler = logging.handlers.RotatingRileHandler(r'C:\Users\Me\Desktop\Logs', 
      maxBytes=1000000, backupCount=4, encoding='ASCII') 
    formatter = logging.Formatter('[%(asctime)s] : %(levelname)-8s: Para: %(parameter)-15s' 
            ' - %(message)s') 
    # parameter is my custom name I want to inject 
    self.logger = logging.getLogger(__name__) 
    self.logger.setLevel(logging.DEBUG) 
    self.logger.addHandler(file_handler) 

    d = {'parameter': ''} 
    self.logger = logging.LoggerAdapter(self.logger, extra=d) 

そして、私のテストで私が書く:

my_obj = MyClass() 
my_obj.logger.error('This is my error.', extra={'parameter': 'True'} 

が、これは常にパラメータフィールド「」(空白文字列)を行います。ログコール(error()debug()など)を行うたびにd辞書を設定する方法はありますか?

+0

クラスの最後の2行を削除するとどうなりますか? LoggerAdapterは各呼び出しに影響を与え、余分なパラメーターをアダプターのパラメーターで置き換えます。唯一のことは、常にdictを提供するか、フォーマットされたものを上書きする必要があるということです。 – rfkortekaas

答えて

3

私はもう少し調べて、LoggerAdapterの 'extra'引数が実際のログアクションの 'extra'引数よりも優先されるようにしました。これは、documentationにも記載されています。あなたはLoggerAdapterクラスをオーバーライドし、次のように処理方法をカスタマイズすることができますしたいものを達成するために

class CustomLoggerAdapter(logging.LoggerAdapter): 

    def process(self, msg, kwargs): 
     """ 
     Process the Logging message and keyword arguments passed in to 
     a logging call to insert contextual information. The extra argument 
     of the LoggerAdapter will be merged with the extra argument of the 
     logging call where the logging call's argument take precedence. 
     """ 
     try: 
      kwargs["extra"] = {**self.extra, **kwargs["extra"]} 
     except KeyError as e: 
      kwargs["extra"] = self.extra 
     return msg, kwargs 

これは、ロギング呼び出しのそれとLoggerAdapterの追加の引数をマージします。ロギングコールの引数が優先されます。

関連する問題