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')
修改後輸出結果:
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。。
所以這裡有以下幾個解決辦法:
1、每次建立不同name的logger,每次都是新logger,不會有新增多個handler的問題。(ps:這個辦法太笨,不過我之前就是這麼幹的。。)
2、像上面一樣每次記錄完日誌之後,呼叫removehandler()把這個logger裡的handler移除掉。
3、在log方法裡做判斷,如果這個logger已有handler,則不再新增handler。
4、與方法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 重複輸出日誌 日誌列印兩次
設定日誌的 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 的訪問日誌檔案。繼續在網上搜尋,找到了一些帖子,照著設定,雖然不太適合用,但確實有日誌記錄了 如下...