2012-01-28 16 views
15

在其他一些技術中,我們偶爾會使用低於DEBUG的日誌級別,我相信這被稱爲「冗長」。我意識到這樣一個級別的需求是非常主觀的。但是在我看來,只有INFO和DEBUG是不夠的。我們有時候需要記錄非常垃圾的東西(比調試更垃圾)。實際上,我們會在沒有打開的情況下生成內部版本,但在少數情況下,我們會在某些QA設置中安裝產品並追蹤錯誤等後啓用此級別的日誌記錄。Python日誌記錄 - 在DEBUG下面有什麼東西嗎?

是否有任何使用標準的python日誌庫來記錄DEBUG級別以下的東西(簡單或其他方式)?

在temp.py文件,我可以做到以下幾點:

logging.addLevelName(5,"verbose") 
VERBOSE = 5 

logger = logging.getLogger("foo") 
logger.setLevel(VERBOSE) 
logger.log(VERBOSE,"blah!") 

這工作,當我我的IDE中運行temp.py(和日誌到標準輸出),但我們真正的守護程序使用標準的文件/字典配置語法來設置日誌記錄,我沒有看到任何方式表明守護程序應該使用5級。

我在追逐那些不可行的東西嗎?

對於那些可能想知道爲什麼我需要比DEBUG更低的東西的人,偶爾會遇到偶爾出現的日誌類型(可能是內部循環),即使在DEBUG中我通常也不會看到它。在某些生產系統上,可能會有一段時間啓用它,而無需向源代碼添加更多日誌記錄並重新部署等。

EDIT1 - 顯然,日誌記錄庫允許自定義級別。由於DEBUG是10級,因此1..9範圍內有空間。如果我定義了自定義級別(例如上面的示例代碼),我想我真正的問題是如何從json日誌配置文件啓用該級別的日誌記錄?

EDIT2 - 下,如果它是不是事實,我們需要/使用JSON配置文件(即我不能改變的要求)會工作:

import logging 

logging.basicConfig(filename='example.log',level=5) 
VERBOSE = 5 
logging.addLevelName(5,"verbose") 
logger = logging.getLogger("bar") 
logger.log(VERBOSE,"blah!") 

EDIT3 - 想通了...致電

logging.addLevelName(5,"VERBOSE") 

是至關重要的。我只是沒有在正確的地方。在我的情況下,我只需要使上述調用之前調用日誌庫dictConfig(...)調用。當我這樣做後,我就可以進入我們的日誌配置文件,並將事件(在文件處理程序和根目錄上)壓縮到VERBOSE,並且它工作。

當然,因爲你調用日誌語句本身不完全是優雅:

self.logger.log(VERBOSE,"Something very spammy") 

而不是

self.logger.verbose("Something very spammy") 

但我真的不想修改任何記錄庫代碼(被在那裏,做到這一點,有T恤)。

謝謝大家!

對於那些誰覺得沒什麼低於需要DEBUG,更多的權力給你:)

+2

「......有助於一段時間......」聽起來*完全*像'DEBUG'一樣。 – 2012-01-28 04:35:55

+0

是的,其中一些歸結爲對DEBUG意味着什麼與INFO等的主觀解釋。我不會將日誌DEBUG語句放在可以執行數百次的內部循環中。但在過去的公司中,我偶爾會在這樣一個循環中放入一個「詳細」的日誌語句。我理解你的觀點。 – 2012-01-28 04:38:33

+1

ISTM日誌記錄的設計是將日誌記錄調用放在任何可能需要的地方,然後通過過濾器或報告一次設置來抑制高音量。 – 2012-01-28 04:45:54

回答

15

DEBUG是最低級別了由日誌模塊提供的國家:('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')。他們的數值在這裏:http://docs.python.org/howto/logging.html#logging-levels

您可以創建custom levels(雖然文檔說這應該很少是必要的,甚至可能是不受歡迎的)。如果你想添加的水平,the technique很簡單:

>>> logging.addLevelName(5, "VERBOSE") 

雖然你們可以添加自定義級別,它可能是一個更好的方法來添加一些過濾器提供更好的控制水平。

+1

這確實如此,但框架顯然允許自定義級別。 DEBUG是10級,因此1..9之間仍然有一些空間:)我只是不確定如何使用這種自定義級別,以便可以從標準JSON日誌記錄設置文件啓用。我想這真的是我的問題......其實我會編輯我的原始問題,指出這是我需要弄清的部分。 – 2012-01-28 04:39:56

+2

你說得對,我需要的只是logging.addLevelName(5,「VERBOSE」)調用。我只是不知道該把它放在哪裏。將它放在logging.config.dictConfig(...)調用之前它工作! – 2012-01-28 06:01:40

9

你甚至可以走得更遠,並添加一個logger.verbose方法,但我強烈建議你不要因爲各種原因(幾乎涵蓋在logging's how-to)。無論如何,如果你決定,你真的想有一個,下面的代碼:

logging.VERBOSE = 5 
logging.addLevelName(logging.VERBOSE, "VERBOSE") 
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs) 
8

答案從@voitek的偉大工程,但他忘了猴子補丁logging.verbose

logging.VERBOSE = 5 
logging.addLevelName(logging.VERBOSE, "VERBOSE") 
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs) 
logging.verbose = lambda msg, *args, **kwargs: logging.log(logging.VERBOSE, msg, *args, **kwargs) 

這現在也適用於;

logging.verbose(*args, **kwargs)