2014-10-06 37 views
0

考慮以下代碼:Python記錄奇怪的行爲

ubuntu_logger = logging.getLogger('ubuntu-logger') 

mail_handler = MailHandler() 
mail_handler.setLevel(logging.INFO) 
ubuntu_logger.addHandler(mail_handler) 

filepath = "/home/ubuntu/logs/central.log" 
formatter = logging.Formatter('[%(asctime)s - %(name)s - %(levelname)s]: %(message)s') 

central_handler = logging.handlers.RotatingFileHandler(
    filename=filepath, 
    mode="a+" 
) 
central_handler.setLevel(logging.DEBUG) 
central_handler.setFormatter(formatter) 
ubuntu_logger.addHandler(central_handler) 

serverutils.logutils創建此處理程序,自定義的Python模塊。然後,我將其導入到我的後臺程序服務腳本,這是root用戶運行:

from serverutils.logutils import ubuntu_logger as logger, DEFAULT_LOGGING_CONFIG 

logger.info('pydaemons launching...') 

通過上面的代碼中,ubuntu_logger來說確實什麼都沒有。改變像下面的代碼後,ubuntu_logger作品如預期,除了根記錄:

import logging 
from serverutils.logutils import ubuntu_logger as logger, DEFAULT_LOGGING_CONFIG 

config = DEFAULT_LOGGING_CONFIG # Fancy format, log level DEBUG 
config.update(filename='/home/ubuntu/test.log') 

logging.basicConfig(**config) 

logging.error('omg, this works') 
logger.info('pydaemons launching...') 

我缺少什麼?

回答

1

你需要設置ubuntu_logger日誌級別:

ubuntu_logger.setLevel(logging.DEBUG) 

否則它會找到WARNING級別默認根記錄器設置來代替。當您運行logging.basicConfig()時,您將根記錄器的日誌級別設置爲DEBUG,因此ubuntu_logger選擇了此級別,並且不再過濾您的INFO級別的日誌消息。

當您撥打logger.log()幫助程序函數(如logger.info())之一時,通常會發生的情況是記錄程序檢查當前級別是否允許該消息。如果它自己的級別是NOTSET(默認值),則會查詢父級日誌對象等,直到找到根,其中缺省值爲WARNING

可能要禁用日誌傳播,如果你有處理程序上的特定記錄器設置:

ubuntu_logger.propagate = False 

否則根記錄是要求處理的日誌信息。傳播不會影響記錄器開始發送消息的級別。

+0

我會更新這個問題,看起來我在錯誤的方向看 – Mazyod 2014-10-06 08:43:07

+1

@Mazyod:如果你這樣做,請刪除*編輯*標題;我們都可以看到編輯歷史,無需在問題本身中對其進行評論。 :-) – 2014-10-06 08:44:02

+0

好的,謝謝。沒有標題更新。 – Mazyod 2014-10-06 08:46:31