2016-06-18 4 views
4

異なるフォーマッタを持つ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以外のクラスのメソッドをオーバーライドするときには問題にはならないようです。

これはロギングモジュールのバグですか、ここに何か不足していますか?

+0

、私は 'logger.handlers [1] .formatter = NONE'とロガーまだ喜んで印刷された2行をしました。しかし、 'logger.handlers [1] = None'は期待通りに物事を壊しました。 – tdelaney

答えて

2

このラインはあなたのダウン秋だった:

record.msg = record.msg.strip().replace('\n', ' ') 

あなたはロガーに接続されているすべての残りのハンドラ/フォーマッタによって使用されているレコードにスクラブ文字列を再割り当て。レコードをコピーし、それが動作:

import logging 
from copy import copy 

logger = logging.getLogger(__name__) 

class CustomFormatter(logging.Formatter): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
    def format(self, record): 
     record = copy(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') 

出力興味深いことに

string with multiple lines 
string with 
multiple lines 
+0

それは理にかなっています - 私の間違いを指摘してくれてありがとう! –

関連する問題