2009-05-18 75 views
24

我正在使用日誌記錄(導入日誌記錄)來記錄消息。我在日誌記錄的調試級別(my_logger.debug('msg'));使用過濾器進行日誌記錄

其中一些調試消息來自function_a()和其他來自function_b(); 我希望能夠啓用/禁用日誌記錄基於它們是來自a還是來自b;

我猜我必須使用Logging的過濾機制。

有人可以告訴我如何下面的代碼將需要儀器儀表來做我想要的?謝謝。

import logging 
logger= logging.getLogger("module_name") 

def function_a(...): 
    logger.debug("a message") 

def function_b(...): 
    logger.debug("another message") 

if __name__ == "__main__": 
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) 

    #don't want function_a()'s noise -> .... 
    #somehow filter-out function_a's logging 
    function_a() 

    #don't want function_b()'s noise -> .... 
    #somehow filter-out function_b's logging 
    function_b() 

如果我把這個簡單的例子擴展到每個模塊更多的模塊和更多的funcs,我會關心很多記錄器;

我可以把它保持在每個模塊1個記錄器嗎?請注意,日誌消息是「結構化的」,即如果記錄它的函數正在執行一些解析工作,它們都包含一個前綴logger.debug(「parsing:xxx」) - 我可以以某種方式用一行關閉 - 關閉所有「解析」消息(無論發送消息的模塊/功能如何)?

回答

36

剛剛實施的logging.Filter子類:http://docs.python.org/library/logging.html#filter-objects。它將有一個方法,filter(record),檢查日誌記錄並返回True記錄它或False放棄它。然後,您可以通過調用addFilter(filter)方法將過濾器安裝在LoggerHandler上。

例子:

class NoParsingFilter(logging.Filter): 
    def filter(self, record): 
     return not record.getMessage().startswith('parsing') 

logger.addFilter(NoParsingFilter()) 

或者類似的東西,反正。

+6

我必須將過濾器添加到處理程序。 – 2012-09-12 03:46:02

15

請勿使用全局。這是一個等待發生的事故。

你可以給你的記錄器任何「。」 - 對你有意義的分隔名稱。

您可以將它們作爲層次結構進行控制。如果您有名爲a.b.ca.b.d的記錄器,則可以檢查a.b的記錄級別並更改兩個記錄器。

您可以有任意數量的記錄器 - 它們便宜。

最常見的設計模式是每個模塊一個記錄器。請參見Naming Python loggers

執行此操作。

import logging 

logger= logging.getLogger("module_name") 
logger_a = logger.getLogger("module_name.function_a") 
logger_b = logger.getLogger("module_name.function_b") 

def function_a(...): 
    logger_a.debug("a message") 

def functio_b(...): 
    logger_b.debug("another message") 

if __name__ == "__main__": 
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) 
    logger_a.setLevel(logging.DEBUG) 
    logger_b.setLevel(logging.WARN) 

    ... etc ... 
+1

感謝S.Lott的回覆;這會起作用;然而,如果我將我的簡單示例擴展爲更多模塊和每個模塊更多funcs,我會擔心很多記錄器;我可以把它保持在每個模塊1個記錄器嗎?注意日誌消息是「結構化的」,即如果記錄它的函數正在做一些解析工作,它們都包含一個前綴logger.debug(「parsing:...」) - 我可以以某種方式用一行代碼只需關閉所有「解析」消息(無論發送消息的模塊/函數如何) – 2009-05-18 21:05:05