2013-01-16 152 views
4

我想將模塊添加到使用標準Python(2.7)日誌記錄庫的項目中。我想實現的是以下幾點:使用Python日誌記錄器記錄到文件和stderr

  • 任何等於或大於警告去哪裏主程序(我的控制範圍之外)已配置日誌去(通常是標準錯誤)
  • 其他一切(調試更糟消息主要)轉到日誌文件

請注意,這裏的關鍵問題是我不想修改全局日誌記錄設置,因爲這些設置由主應用程序控制。否則,我會用例子在這裏:

http://docs.python.org/2/howto/logging-cookbook.html#logging-to-multiple-destinations

我已經試過這樣:

logger = logging.getLogger('my_module') 
logger.setLevel(logging.WARNING) 
fh = logging.FileHandler('my_module.log') 
fh.setLevel(logging.DEBUG) 
logger.addHandler(fh) 

但當時我只是得到我的文件警告消息。

如果我替換上面的一行:

logger.setLevel(logging.DEBUG) 

然後我得到了這兩個標準錯誤,我的文件調試消息。

然後我嘗試這樣的:

logger = logging.getLogger('my_module') 
logger.setLevel(logging.DEBUG) 
logger.addHandler(logging.NullHandler()) 
console = logging.StreamHandler() 
console.setLevel(logging.WARNING) 
logger.addHandler(console) 
fh = logging.FileHandler('my_module.log') 
fh.setLevel(logging.DEBUG) 
logger.addHandler(fh) 

但同樣沒有運氣。

所以,我可以實現這一點,而無需調用basicConfig()或其他任何影響全球日誌記錄基礎設施?如果可能,我只想在這裏修改我自己的模塊。

謝謝!

回答

2
  • 任何等於或大於警告去哪裏主程序(我的控制範圍之外)已配置日誌去 (通常是標準錯誤)
  • 其他一切(調試消息爲主)去一個更壞日誌文件

你不能用一個單一的記錄做沒有對祖先的處理程序設置警戒線。從the docs

Logger.propagate 

如果該值爲true,記錄消息由該記錄器和其子logger上級 (祖先)記錄器的處理程序通過。消息被直接傳遞給祖先 記錄器的處理程序 - 既不考慮記錄器的祖先 的級別也不過濾器。


你有什麼建議模塊可以在這種情況下怎麼辦?

除了爲記錄器設置WARNING級別並添加NullHandler()之外,庫代碼不應配置日誌記錄。

如果你想讓主應用程序爲你提供一個調試信息的簡單方法,然後定義一個函數來爲你的庫配置DEBUG級日誌記錄。


我不希望庫是除了文件,在這裏我想看到的一切DEBUG。

如果你無法控制的主程序,那麼你不應該創建調試文件,使用your_module的副作用,除非明確要求這樣做:

import your_module # in the main application 

your_module.get_logger().log_to_file(filename) # without this line your module 
               # shouldn't create debug files 
... 
your_module.some_function() 

我不確定此記錄器層次結構如何工作:我創建的記錄器是應用程序配置的根記錄器的子項?

''是根記錄器。 'a.b''a'記錄器的子碼。

+0

感謝您的回覆。如果無法這樣做,那麼在這種情況下,模塊可以做什麼?我不太瞭解你的關於爲庫配置DEBUG的函數的建議。除了文件,我不希望圖書館進行DEBUG,我希望看到所有內容。我不確定此記錄器層次結構如何工作:我創建的記錄器是應用程序配置的根記錄器的子項? – introiboad

+0

@introiboad:我在評論中添加了對問題的答案。 – jfs

+0

謝謝你的回答。 – introiboad

0

嘗試創建兩個指向同一文件的記錄器。一個.ERROR和一個.WARNING。從來沒有用Python做過,但我不明白爲什麼它不起作用。只要你在寫入後刷新你的流,除非你正在運行協同例程,否則它們不應該互相干擾,在這種情況下,你需要在某些鎖等中編程。只要你的程序線性運行,你不應該有任何擔憂。

+0

這並不能達到我想要的效果。如果我將日誌記錄級別設置爲DEBUG,則所有內容都會轉到stderr,如果將其設置爲WARNING,則不會有任何調試信息進入該文件,這是我的問題。 – introiboad