私のライブラリにカスタムフォーマットフィールドを追加しようとしています。私は、これが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
辞書を設定する方法はありますか?
クラスの最後の2行を削除するとどうなりますか? LoggerAdapterは各呼び出しに影響を与え、余分なパラメーターをアダプターのパラメーターで置き換えます。唯一のことは、常にdictを提供するか、フォーマットされたものを上書きする必要があるということです。 – rfkortekaas