2017-10-30 14 views
2

MyClassを複数回インスタンス化すると、同じレコードがログに複数回表示されます(クラスの2番目または3番目の初期化後)。ロガーが同じ情報を何度も印刷するのを防ぐには?

このソリューションは、すでにこれらの提案によって改善される:

Duplicate log output when using Python logging module

Python logging module is printing lines multiple times

マイロガーソリューションは、次のようになります。

import logging 
import logging.handlers 
import os 

OUTPUT_DIRECTORY_PATH = r'..\out' 
LOG_DIRECTORY_PATH  = os.path.join(OUTPUT_DIRECTORY_PATH, "logs") 

loggers = {} 
def PlatformLogger(moduleName): 

    global loggers 

    if loggers.get(moduleName): 

     return loggers.get(moduleName) 

    else: 

     # create logger with moduleName parameter 
     logger = logging.getLogger(moduleName) 
     logger.setLevel(logging.DEBUG) 

     # create console handler with a higher log level 
     ch = logging.StreamHandler() 
     ch.setLevel(logging.INFO) 

     # create file handler which logs even debug messages 
     fh = logging.FileHandler(os.path.join(LOG_DIRECTORY_PATH, 'error.log')) 
     fr = logging.handlers.RotatingFileHandler(os.path.join(LOG_DIRECTORY_PATH, 'event.log')) 
     fh.setLevel(logging.WARN) 
     fr.setLevel(logging.DEBUG) 

     # create formatter and add it to the handlers 
     formatter = logging.Formatter('[%(asctime)s] - %(name)s - %(levelname)s - %(message)s') 
     fh.setFormatter(formatter) 
     fr.setFormatter(formatter) 
     ch.setFormatter(formatter) 

     # add the handlers to the logger 
     logger.addHandler(fh) 
     logger.addHandler(fr) 
     logger.addHandler(ch) 

     # updating loggers 
     loggers.update(dict(name=logger)) 

     return logger 


class MyClass: 

    def __init__(self): 
     self.logger = PlatformLogger(__name__) 

    def doSomething(self, actionName): 
     self.logger.info("action: " + actionName) 



dm1 = MyClass() 
dm1.doSomething("action 1") 
dm2 = MyClass() 
dm2.doSomething("action 2") # <- this is prited twice 

ログにどのようなものです:

[2017-10-30 06:47:45,198] - __main__ - INFO - action: action 1 
[2017-10-30 06:47:45,201] - __main__ - INFO - action: action 2 
[2017-10-30 06:47:45,201] - __main__ - INFO - action: action 2 

私は間違っていますか?この行動を防ぐために私は何をすべきですか?

答えて

1

loggers.update(dict(name=logger))の代わりにloggers.update({moduleName: logger})とする必要があります。

logger = logging.getLogger(moduleName)では、常に同じ名前のロガーを取得します。したがって、クラスをインスタンス化するたびに、新しいハンドラーをロガーに追加し、すべてのハンドラーが行を出力します。すべてのロギングをモジュールレベルで一度だけ設定する必要があります。

関連する問題