python logging 重複寫日誌問題

2022-05-06 23:54:09 字數 3613 閱讀 7158

原因:沒有移除handler

解決:在日誌記錄完之後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 - 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 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 - 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 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 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 重複寫日誌問題

在用logging模組寫日誌的時候,遇到了日誌重複列印的問題。即在同乙個指令碼中第一次呼叫,正常顯示,第二次呼叫,則顯示了重複的兩條,以此類推,非常頭疼。網上找到原因 沒有刪除前一次呼叫的handle物件 示例import logging deflog message logger logging....