在用logging模組寫日誌的時候,遇到了日誌重複列印的問題。即在同乙個指令碼中第一次呼叫,正常顯示,第二次呼叫,則顯示了重複的兩條,以此類推,非常頭疼。
網上找到原因:沒有刪除前一次呼叫的handle物件
示例
importlogging
deflog(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 -hi2016-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
修改後的**:
importlogging
deflog(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 -hi2016-07-08 09:32:28,206 - error - testlog -hi too
2016-07-08 09:32:28,206 - error - testlog - hi three
深度解析
第二次呼叫log的時候,根據getlogger(name)裡的name獲取乙個logger物件,而這個logger物件裡已經有了第一次新增的handler,第二次又新增了乙個handler,所以logger物件裡有兩個相同的handler,以此類推,呼叫幾次就有幾個handler。
解決方法:1.每次呼叫都修改getlogger(name) 中的name
2.使用removehandler(handlername)
3.在log方法裡做判斷,是否已經存在handler
4.使用pop函式把handle列表中的handler刪除
方法三:
importlogging
deflog(message):
logger = logging.getlogger('
testlog')
#這裡進行判斷,如果logger.handlers列表為空,則新增,否則,直接去寫日誌
ifnot
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
')
方法四:
importlogging
deflog(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
')
python logging 重複寫日誌問題
原因 沒有移除handler 解決 在日誌記錄完之後removehandler 修改前示例 import logging deflog message logger logging.getlogger testlog streamhandler logging.streamhandler strea...
python logging 日誌重複列印兩次
在檢視專案檔案輸出的執行日誌時發現每句日誌都會列印兩次 info和debug均出現此問題 工程檔案中一般會配置log,解決方法是將引數propagate修改為false coding utf 8 log util.py 提供日誌支援。copyrith c 2020 dingdang cat modi...
python logging 重複寫日誌問題
原因 沒有移除handler 解決 在日誌記錄完之後removehandler 修改前示例 import logging def log message logger logging.getlogger testlog streamhandler logging.streamhandler stre...