2011-04-13 59 views
3

有沒有從調用logging.debug()獲取/返回消息的方法?捕獲/返回python日誌記錄的輸出消息

謝謝

+1

你應該告訴我們關於上下文的一些事情:你自己編寫日誌代碼,還是想攔截來自另一個模塊/框架/日誌消息? – 2011-04-13 14:02:53

+0

hi das,我問的原因是我啓動(使用subprocess.Popen)一些子進程(C++程序)併爲每個進程創建一個python記錄器。每個進程的輸出記錄到每個進程記錄器。我想要一個包含每個進程輸出的「主」日誌,以便主日誌中的每個條目都包含每個進程的記錄器名稱作爲標識符 – mikip 2011-04-14 08:38:20

回答

0

那麼,logging.debug通常寫入文件。您可以使用open()函數來讀取該文件。

+0

您也可以在Windows中省略「.exe」。這會將所有輸出存儲到該txt文件。 – khachik 2011-04-13 13:00:05

+0

@khchik:我拋棄了我的第一個答案,因爲我得到了全部錯誤 – 2011-04-13 13:02:05

+0

'logging.debug()'只寫入文件,如果你配置他們這樣做。 – ncoghlan 2011-04-13 13:54:32

0

也許在啓動時替換logging.debug

import logging 
d = logging.debug 
def myDebug(*args): 
    print "I'm a spy", args 
    d(*args) 
logging.debug = myDebug 
+3

從來沒有這樣做。鑑於其本身提供的巨大可配置性,絕對沒有理由對日誌記錄模塊進行猴式修補。 – ncoghlan 2011-04-13 13:53:56

4

是,提供了一個機制,以容易地捕獲和重定向事件的詳細信息,而無需任何修改的代碼發射的事件是logging模塊的全部目的。

您所需要做的只是在應用程序啓動時對logging.basicConfig()進行適當調用,您可以隨時隨地發送記錄的事件。

最簡單的就是隻要登錄到stdout

import logging 
import sys 
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 

對於更高級的選項,我建議檢查出的官方文檔中的logging tutorial

如果您希望在撥打電話的位置編程式訪問格式化的郵件,那麼logging模塊是該作業的錯誤工具。它專爲發射事件而設計,不能用作直接呼叫str.format的替代方案。

爲您在您的評論描述的情況,你可能要考慮大意如下的一個hierarchical logging設置:

>>> import logging 
>>> import sys 
>>> logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 
>>> master = logging.getLogger("master") 
>>> child1 = logging.getLogger("master.child1") 
>>> child2 = logging.getLogger("master.child2") 
>>> child1.debug("Event from child 1") 
DEBUG:master.child1:Event from child 1 
>>> child2.debug("Event from child 2") 
DEBUG:master.child2:Event from child 2 

在此設置中,請注意,我只在該根級別配置的處理程序層次結構(作爲basicConfig()調用的一部分)。 logging瞭解記錄器名稱中的「parent.child」表示法,因此它會將傳遞給子記錄器的所有事件傳遞給主記錄器,然後再將它們傳遞給根記錄器。

根據需要,您可以在masterchild級別添加其他日誌處理程序,以便根據需要重定向輸出。

+0

謝謝ncoghlan。我問的原因是我啓動(使用subprocess.Popen)一些子進程(C++程序)併爲每個進程創建一個記錄器。每個進程的輸出都記錄到每個進程記錄器。我想要一個包含每個進程輸出的「主」日誌,以便主日誌中的每個條目都以每個進程的記錄器名稱作爲標識符。 – mikip 2011-04-13 14:35:56

+0

更新了我的答案 - 分層記錄器名稱應該完全符合您的「重新過後。 – ncoghlan 2011-04-14 05:34:50

相關問題