python logging 重複寫日誌問題
用python的logging模組記錄日誌時,遇到了重覆記錄日誌的問題,第一條記錄寫一次,第二條記錄寫兩次,第三條記錄寫三次。。。很頭疼,這樣記日誌可不行。網上搜尋到了原因與解決方案:
原因:沒有移除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')
google之後,大概搞明白了,就是你第二次呼叫log的時候,根據getlogger(name)裡的name獲取同乙個logger,而這個logger裡已經有了第一次你新增的handler,第二次呼叫又新增了乙個handler,所以,這個logger裡有了兩個同樣的handler,以此類推,呼叫幾次就會有幾個handler。。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
所以這裡有以下幾個解決辦法:
1、每次建立不同name的logger,每次都是新logger,不會有新增多個handler的問題。(ps:這個辦法太笨,不過我之前就是這麼幹的。。)
2、像上面一樣每次記錄完日誌之後,呼叫removehandler()把這個logger裡的handler移除掉。
3、在log方法裡做判斷,如果這個logger已有handler,則不再新增handler。
4、與方法2一樣,不過把用pop把logger的handler列表中的handler移除。
下面是方法3與方法4的**示例:
方法3 :
方法4: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')
這幾種方法親測可行,個人感覺方法3 更優雅,您覺得呢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')
Python 重複輸出日誌 日誌列印兩次
設定日誌的 log setup.py import logging def setup log name name filename none logger logging.getlogger name logger.setlevel level logging.info formatter log...
python寫入日誌檔案時日誌內容重複寫入
python寫入日誌檔案時日誌內容重複寫入 原因handler未移除,導致重複寫入 問了度娘之後,大概搞明白了,就是你第二次呼叫log的時候,根據getlogger name 裡的name獲取同乙個logger,而這個logger裡已經有了第一次你新增的handler,第二次呼叫又新增了乙個hand...
tomcat 日誌輸入
server.xml 中最後有乙個日誌記錄閥的注釋去掉就可以在 tomcat home logs 目錄中找到採用標準common 日誌格式的 localhost access 20101113.txt 的訪問日誌檔案。繼續在網上搜尋,找到了一些帖子,照著設定,雖然不太適合用,但確實有日誌記錄了 如下...