python loggingは繰り返しログの問題解決方法を書きます。


python logging日記の問題を繰り返し書きます。
Pythonのloggingモジュールでログを記録する時、重複してログを記録する問題に出会って、第一条は一回を記録して、第二条は二回を記録して、第三条は三回を記録します。頭が痛くて、このように日誌を覚えてはいけません。インターネットで原因と解決策を検索しました。
理由:ハンドルを外していませんでした。
解決:ログ記録が終わったらremoveHandler
変更前のコード例:

import logging


def log(message):
 logger = logging.getLogger('testlog')

 streamhandler = logging.StreamHandler()
 streamhandler.setLevel(logging.ERROR)
 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
 streamhandler.setFormatter(formatter)

 logger.addHandler(streamhandler)
 logger.error(message)

if __name__ == '__main__':
 log('hi')
 log('hi too')
 log('hi three')
修正前の出力結果:
2016-07-08 09:17:29,740-ERROR-testlog-hi
2016-07-08 09:17:29,740-ERROR-testlog-hi too
2016-07-08 09:17:29,740-ERROR-testlog-hi too
2016-07-08 09:17:29,740-ERROR-testlogs-hi three
2016-07-08 09:17:29,740-ERROR-testlogs-hi three
2016-07-08 09:17:29,740-ERROR-testlogs-hi three
変更後のコード例:

import logging


def log(message):
 logger = logging.getLogger('testlog')

 streamhandler = logging.StreamHandler()
 streamhandler.setLevel(logging.ERROR)
 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
 streamhandler.setFormatter(formatter)

 logger.addHandler(streamhandler)
 logger.error(message)

 #       ,           
 logger.removeHandler(streamhandler)

if __name__ == '__main__':
 log('hi')
 log('hi too')
 log('hi three')
修正後出力結果:
2016-07-08 09:32:28,206-ERROR-testlog-hi
2016-07-08 09:32:28,206-ERROR-testlog-hi too
2016-07-08 09:32:28,206-ERROR-testlogs-hi three
深さ解析:
Googleの後、大体分かりました。あなたが2回目のロゴを呼び出した時、get Loggarのnameによって同じloggerを取得しました。このloggerには最初にあなたが追加したhandlerがあります。2回目の呼び出しにはhandlerが追加されていますので、このloggerには同じhandlerが2つあります。
ここには以下の解決方法があります。
  • 毎回異なるnameのloggerを作成して、毎回新しいloggerで、複数のhandlerを追加する問題がありません。ps:この方法はあまりにも愚かです。でも、前はこのようにしていました。)
  • は上記のようにログを記録した後、RemoveHandlerを呼び出してこのログガーのhandlerを削除します。ロゴの方法で判断しますが、このロゴがすでにhandlerにあるなら、handlerを追加しません。
  • は方法2と同じですが、popでロゴのhandlerリストのhandlerを削除します。
  • 方法3と方法4のコード例を以下に示す。
    方法3:
    
    import logging
    
    
    def log(message):
     logger = logging.getLogger('testlog')
    
     #       ,  logger.handlers    ,   ,  ,      
     if not logger.handlers:
     streamhandler = logging.StreamHandler()
     streamhandler.setLevel(logging.ERROR)
     formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
     streamhandler.setFormatter(formatter)
     logger.addHandler(streamhandler)
    
     logger.error(message)
    
    
    if __name__ == '__main__':
     log('hi')
     log('hi too')
     log('hi three')
    
    方法4:
    
    import logging
    
    
    def log(message):
     logger = logging.getLogger('testlog')
    
     streamhandler = logging.StreamHandler()
     streamhandler.setLevel(logging.ERROR)
     formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
     streamhandler.setFormatter(formatter)
    
     logger.addHandler(streamhandler)
    
     logger.error(message)
    
     #  pop   logger.handlers    handler  ,     add   handler,     pop,       handlers     
     logger.handlers.pop()
     # logger.handler = []
    
    
    if __name__ == '__main__':
     log('hi')
     log('hi too')
     log('hi three')
    
    これらの方法は全部自分で試してもいいです。個人的には方法3の判断がもっと優雅だと思いますが、どう思いますか?
    ここでは、python logingについて日記を繰り返し書いています。j解決方法の詳細な文章はここまで紹介しています。python logingについては、日記の問題を繰り返し書いています。私たちの以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。