2012-09-26 129 views
3

我正在使用python的標準日誌記錄系統來記錄我的應用程序。我想打印所有類型的消息(通過關鍵調試)到控制檯,但如果消息級別錯誤或更高,我也想發送電子郵件。我一直在閱讀有關日誌記錄的文檔,但它有點令人困惑。我設置了下面的測試,但它似乎沒有正常工作:設置python logging的麻煩

import logging 

log = logging.getLogger('my_test_log') 
sublog = logging.getLogger('my_test_log.sublog') 

log.setLevel(logging.ERROR) 
log.addHandler(logging.StreamHandler()) 

sublog.addHandler(logging.StreamHandler()) 
sublog.setLevel(logging.DEBUG)  

sublog.debug('This is a debug message') 
sublog.info('This is an info message') 
sublog.warn('This is a warn message') 
sublog.error('This is an error message') 
sublog.critical('This is a critical message') 

注:我成立了兩個日誌StreamHandler中的,因爲現在我不想垃圾郵件還沒有,但應該在技術上只需打印錯誤和重要消息兩次,而不是在這種情況下發送給電子郵件。

This is a debug message 
This is a debug message 
This is an info message 
This is an info message 
This is a warn message 
This is a warn message 
This is an error message 
This is an error message 
This is a critical message 
This is a critical message 

基本上一切都被印刷兩次,而不僅僅是錯誤和關鍵消息:在此之後的作品通過電子郵件發送它關閉

這是我的輸出,當我運行這段代碼,我將其更改爲SMTP。我在這裏做錯了什麼?謝謝!

回答

2

經過一番快速研究,似乎Handler對象不會自動使用其父記錄器的日誌級別。你必須set the level yourself

import logging 

log = logging.getLogger('my_test_log') 
sublog = logging.getLogger('my_test_log.sublog') 

log.setLevel(logging.ERROR) 
handler = logging.StreamHandler() 
handler.setLevel(logging.ERROR) 
log.addHandler(handler) 

... 
+0

好吧,這將有道理爲什麼它不會工作。我只是試過這個,它的工作原理!謝謝! –

0

你的問題是你的子級上的級別設置爲DEBUG。所以,你會得到所有的消息(只是改變爲錯誤)。此外,logger.propagate爲True也有問題。

這應該修復它:

sublog.propagate = False 

這將停止重複的消息。

查看有關logging here的文檔。