2012-10-29 106 views
2

到目前爲止,我一直在用'打印調試信息',甚至'如果條件:打印調試信息'。但許多人告訴我,這不是最好的方式,我真的應該學習如何使用日誌記錄模塊。快速閱讀後,它看起來好像它做我可能想要的一切,然後一些。它本身就像一個學習項目,我現在想要在其他項目上工作,只需使用最少的功能來幫助我。如果它有什麼不同,我將使用python 2.6,並且由於圖書館和遺留兼容性,它將爲未來的發展做好準備。如何用日誌記錄模塊取代打印調試信息

我現在想要做的就是用我可以打開和關閉的消息來胡椒我的代碼,因爲我設法調試特定區域。作爲「hello_log_world」,我想這一點,並沒有做什麼,我希望

import logging 

# logging.basicConfig(level=logging.DEBUG) 

logging.error('first error') 
logging.debug('first debug') 

logging.basicConfig(level=logging.DEBUG) 

logging.error('second error') 
logging.debug('second debug') 

你會發現我使用的是很基本的配置,使用盡可能多的違約可能,讓事情變得簡單。但似乎它太簡單了,或者我不明白日誌背後的編程模型。

我當時認爲sys.stderr最終會

ERROR:root:first error 
ERROR:root:second error 
DEBUG:root:second debug 

...但只有兩個錯誤信息出現。設置級別= DEBUG不會使第二個出現。如果我在程序開始時取消註釋basicConfig調用,所有四個都會得到輸出。

我試圖在一個簡單的級別運行它嗎?

什麼是最簡單的事情,我可以添加到我寫在那裏得到我的預期行爲?

回答

2

日誌記錄實際上遵循特定的層次結構(DEBUG -> INFO -> WARNING -> ERROR -> CRITICAL),並且默認級別爲WARNING。因此,您看到兩條ERROR消息的原因是因爲它在層次鏈上比WARNING高。

至於奇評論的行爲,說明在logging docs找到(像你說的這是你們自己:)任務):

到basicConfig()的調用應該到任何調用之前調試(), 信息()等。因爲它旨在作爲一次性簡單配置 設施,只有第一個呼叫實際上會做任何事情:後續 調用實際上是沒有操作。

但是你可以使用setLevel參數來獲取你的願望:

import logging 

logging.getLogger().setLevel(logging.ERROR) 

logging.error('first error') 
logging.debug('first debug') 

logging.getLogger().setLevel(logging.DEBUG) 

logging.error('second error') 
logging.debug('second debug') 

缺乏一個參數getLogger()的指根記錄被修改。這實際上是@ del's(good)答案之前的一個步驟,你開始進入多個記錄器,每個記錄器都有自己的特定屬性/輸出級別/等等。

+0

謝謝,這工作,因爲我想它的工作。我沒有點擊過對basicConfig()的調用是一次性的。但是,我認爲它比這更微妙。我懷疑,通過我的聲明「logging.error('first error')」首次使用日誌記錄模塊時,模塊會默認使用basicConfig()進行隱式調用,這意味着第一個和第二個錯誤是無效的。這是一些網關代碼。一旦我通過設置關卡來進行誘惑,然後格式化,我會在太久之前進入多個記錄器。 –

+0

@Neil_UK我認爲你的位置:)網關代碼是一個很好的術語,你應該註冊它。絕對有用的功能,能夠處理與多個記錄器(可寫入'標準輸出,文件,或兩者等)的日誌記錄。有一件事我總覺得很有趣(當談到對調試的記錄時),Ken Thompson主要是通過'print'語句來獲得:) http://jmprog.blogspot.com/2009/11/ken-thompson-關於調試,with.html – RocketDonkey

1

與其修改代碼中的日誌記錄級別以控制輸出,應該考慮創建多個記錄器,並分別爲每個記錄器設置日誌記錄級別。例如:

import logging 

first_logger = logging.getLogger('first') 
second_logger = logging.getLogger('second') 

logging.basicConfig() 
first_logger.setLevel(logging.ERROR) 
second_logger.setLevel(logging.DEBUG) 

first_logger.error('first error') 
first_logger.debug('first debug') 

second_logger.error('second error') 
second_logger.debug('second debug') 

此輸出:

 
ERROR:first:first error 
ERROR:second:second error 
DEBUG:second:second debug