2017-11-29 7 views
2

私はBufferingHandlerをサブクラス化してlogging.handlersモジュールにサブクラス化して独自のログハンドラを作成しています。logging.handlers.BufferingHandlerサブクラス化されたハンドラのログを2回表示する

from logging.handlers import BufferingHandler 
import logging 

LOG_FORMAT = '%(asctime)s %(levelname)s: %(message)s' 
logger = logging.getLogger('LogArchiver') 
logger.setLevel(logging.DEBUG) 
formatter = logging.Formatter(LOG_FORMAT) 

class MyLogHandler(BufferingHandler): 
    def __init__(self, capacity): 
     logging.handlers.BufferingHandler.__init__(self, capacity) 

    def flush(self): 
     for record in self.buffer: 
      print(self.format(record)) 
      #pass 

    def shouldFlush(self, record): 
     return False 


h = MyLogHandler(1000) 
h.setLevel(logging.INFO) 
h.setFormatter(formatter) 
logger.addHandler(h) 

if __name__ == '__main__': 
    for i in range(5): 
     logger.info('test %s', i) 

これがうまく機能したがBufferingHandlerが、私はいけない、デフォルトでコンソールに紅潮されるように二回ログの行を示しています。私は何を期待その印刷...

[email protected]:/mnt/tmp/alok# python /tmp/testlog.py 
2017-11-29 15:01:07,480 INFO: test 0 
2017-11-29 15:01:07,480 INFO: test 1 
2017-11-29 15:01:07,480 INFO: test 2 
2017-11-29 15:01:07,480 INFO: test 3 
2017-11-29 15:01:07,480 INFO: test 4 
2017-11-29 15:01:07,480 INFO: test 0 
2017-11-29 15:01:07,480 INFO: test 1 
2017-11-29 15:01:07,480 INFO: test 2 
2017-11-29 15:01:07,480 INFO: test 3 
2017-11-29 15:01:07,480 INFO: test 4 

は、これは私がコンソール上に余分なフラッシュを見ていますどこからのみ

[email protected]:/mnt/tmp/alok# python /tmp/testlog.py 
2017-11-29 15:01:07,480 INFO: test 0 
2017-11-29 15:01:07,480 INFO: test 1 
2017-11-29 15:01:07,480 INFO: test 2 
2017-11-29 15:01:07,480 INFO: test 3 
2017-11-29 15:01:07,480 INFO: test 4 

を印刷する必要がありますか?

+0

である必要があります。どのようにログを確認していますか?あなたが 'tail -f'をやっているのか、スクリプトが実行されたらログファイルを開くだけですか? – NoobEditor

+0

私はそのカスタムハンドラと印刷ログのみをコンソールに使用しています。私は 'FileHandler'を使用していないので、ログを監視する' tail -f'のポイントはありません。 –

答えて

0

他のコードを見た後、私はフラッシュ後にself.bufferを空にすることができなかったことが分かります。したがって、適切なコードは

from logging.handlers import BufferingHandler 
import logging 

LOG_FORMAT = '%(asctime)s %(levelname)s: %(message)s' 
logger = logging.getLogger('LogArchiver') 
logger.setLevel(logging.DEBUG) 
formatter = logging.Formatter(LOG_FORMAT) 

class MyLogHandler(BufferingHandler): 
    def __init__(self, capacity): 
     logging.handlers.BufferingHandler.__init__(self, capacity) 

    def flush(self): 
     for record in self.buffer: 
      print(self.format(record))    
     super(MyLogHandler, self).flush() 

    def shouldFlush(self, record): 
     return False 


h = MyLogHandler(1000) 
h.setLevel(logging.INFO) 
h.setFormatter(formatter) 
logger.addHandler(h) 

if __name__ == '__main__': 
    for i in range(5): 
     logger.info('test %s', i) 
+0

はい、親クラス 'flush()'を使うべきです(スーパーセーフ(MyLogHandler、self)。 flush() ' –

+0

' super(MyLogHandler、self).flush() 'を使用する場合は、フラッシング時に電子メールを送信するような、私の意図するフラッシング戦略をどのように入れますか? –

+1

'self.buffer = []'を 'super(MyLogHandler、self).flush()'に置き換えてください。 –

関連する問題