python loggingは繰り返しログの問題解決方法を書きます。
python logging日記の問題を繰り返し書きます。
Pythonのloggingモジュールでログを記録する時、重複してログを記録する問題に出会って、第一条は一回を記録して、第二条は二回を記録して、第三条は三回を記録します。頭が痛くて、このように日誌を覚えてはいけません。インターネットで原因と解決策を検索しました。
理由:ハンドルを外していませんでした。
解決:ログ記録が終わったらremoveHandler
変更前のコード例:
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
変更後のコード例:
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:
ここでは、python logingについて日記を繰り返し書いています。j解決方法の詳細な文章はここまで紹介しています。python logingについては、日記の問題を繰り返し書いています。私たちの以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。
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つあります。
ここには以下の解決方法があります。
方法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については、日記の問題を繰り返し書いています。私たちの以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。