国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

python logging 重復寫日志問題解決辦法詳解

瀏覽:85日期:2022-07-15 10:21:51

python logging 重復寫日志問題

用Python的logging模塊記錄日志時,遇到了重復記錄日志的問題,第一條記錄寫一次,第二條記錄寫兩次,第三條記錄寫三次。。。很頭疼,這樣記日志可不行。網上搜索到了原因與解決方案:

原因:沒有移除handler 解決:在日志記錄完之后removeHandler

修改前示例代碼:

import loggingdef 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 - testlog - hi three 2016-07-08 09:17:29,740 - ERROR - testlog - hi three 2016-07-08 09:17:29,740 - ERROR - testlog - hi three

修改后示例代碼:

import loggingdef 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 - testlog - hi three

深度解析:

Google之后,大概搞明白了,就是你第二次調用log的時候,根據getLogger(name)里的name獲取同一個logger,而這個logger里已經有了第一次你添加的handler,第二次調用又添加了一個handler,所以,這個logger里有了兩個同樣的handler,以此類推,調用幾次就會有幾個handler。。

所以這里有以下幾個解決辦法:

每次創建不同name的logger,每次都是新logger,不會有添加多個handler的問題。(ps:這個辦法太笨,不過我之前就是這么干的。。) 像上面一樣每次記錄完日志之后,調用removeHandler()把這個logger里的handler移除掉。在log方法里做判斷,如果這個logger已有handler,則不再添加handler。 與方法2一樣,不過把用pop把logger的handler列表中的handler移除。

下面是方法3與方法4的代碼示例:

方法3:

import loggingdef 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 loggingdef 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 logging 重復寫日志問題j解決辦法詳解的文章就介紹到這了,更多相關python logging 重復寫日志問題內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 欧美三级香港三级日本三级 | 日本一区二区不卡久久入口 | 久久久免费精品 | 正在播放国产精品放孕妇 | 国产一区二区三区久久 | 欧美成人一区二区三区在线视频 | 国产下药迷倒白嫩丰满美女j8 | 国产精品三级一区二区 | 伊在人亚洲香蕉精品区 | 久久爱www成人 | 免费黄色三级网站 | 日韩亚洲一区中文字幕 | 日产一区2区三区有限公司 日产一区两区三区 | 欧美一区二区精品 | 欧美一级片在线视频 | 中文字幕国产一区 | 女人把腿劈开让男人桶的网站 | 成人毛片免费视频 | 欧美三级成版人版在线观看 | 黄a在线观看 | 91伊人久久| 美国毛片一级视频在线aa | 国产亚洲高清在线精品不卡 | 美女张开双腿让男人桶视频免费 | 国产精品无圣光一区二区 | 韩日一级| 亚洲一区精品在线 | 99在线精品视频免费观里 | 欧美成人在线视频 | 在线观看国产情趣免费视频 | 99亚洲精品 | 久久精品国产福利 | www中文字幕在线观看 | 国产小毛片 | 天天澡天天碰天天狠伊人五月 | 精品一区二区三区高清免费不卡 | 韩国毛片免费看 | 九九免费精品视频在这里 | 国产一区免费观看 | 国产婷婷一区二区在线观看 | 国产精品亚洲一区二区在线观看 |