異なるフォーマッタを持つ2つのハンドラを自分のロガーに追加しました。最初のものはカスタムフォーマッティングを行うためにlogging.Formatterのサブクラス化を必要とします。 2番目のハンドラでは、デフォルトのフォーマッタで十分です。サブクラスlogging.Formatterの変更デフォルトlogging.Formatterの動作
最初のフォーマッタは、単にメッセージから改行文字を削除するとします。
string with multiple lines
string with multiple lines
が、私はこの代わりに期待:
string with multiple lines
string with
multiple lines
二フォーマッタはの動作を実装するべきではありません。これは、次の出力
import logging
logger = logging.getLogger(__name__)
class CustomFormatter(logging.Formatter):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def format(self, record):
record.msg = record.msg.strip().replace('\n', ' ')
return super().format(record)
h1 = logging.StreamHandler()
formatter1 = CustomFormatter(fmt=None, datefmt=None)
h1.setFormatter(formatter1)
logger.addHandler(h1)
h2 = logging.StreamHandler()
formatter2 = logging.Formatter(fmt=None, datefmt=None)
h2.setFormatter(formatter2)
logger.addHandler(h2)
logger.warning('string with\nmultiple lines')
:次のスクリプトは、奇妙な行動のように思えるものを示していますCustomFormatter、それはまだありません。ハンドラがロガーに追加される順序を逆にすると、これは起こりません。
サブクラス化を誤解しない限り、サブクラス内のメソッドをオーバーライドすることによって、基本クラスの動作を変更してはなりません。これは、logging.Formatter以外のクラスのメソッドをオーバーライドするときには問題にはならないようです。
これはロギングモジュールのバグですか、ここに何か不足していますか?
、私は 'logger.handlers [1] .formatter = NONE'とロガーまだ喜んで印刷された2行をしました。しかし、 'logger.handlers [1] = None'は期待通りに物事を壊しました。 – tdelaney