2011-06-28 127 views
2

在常量運行循環內創建日誌(使用python日誌記錄模塊)的好方法是什麼,而不會產生大量無用的日誌文件? 一個例子就是一個循環,它會持續列出一個文件夾,並在看到一個特定類型的文件時執行一些操作。 我想記錄沒有找到文件,或者找到了文件但類型錯誤,而且每次檢查文件夾時都不會記錄相同的行,因爲它可能每秒運行多次。登錄連續循環

+4

您是在查找「if」語句嗎? – Gandi

+2

請嘗試更好地解釋它。 – juankysmith

+0

你能否澄清你的問題...所以你想讓它在循環中每隔500次記錄一次?或者您是否希望只在郵件發生變化時才進行登錄? – EdoDodo

回答

4

創建你所需要的任何其他功能的Handler子類。請將您不想再次輸入emit的最後一條或所有先前記錄的郵件存儲起來:

def make_filetype_aware_handler(handler_class): 
    class DontRepeatFiletypeHandler(handler_class): 

     def __init__(self, *args, **kwds): 
      super().__init__(*args, **kwds) 
      self.previous_types = set() 

     def emit(self, record): 
      if not record.file_type in self.previous_types: 
       self.previous_types.add(record.file_type) 
       super().emit(record) 
    return DontRepeatFiletypeHandler 

FiletypeStreamHandler = make_filetype_aware_handler(logging.StreamHandler) 

logger = logging.getLogger() 
logger.addHandler(FiletypeStreamHandler(sys.stderr)) 
logger.debug('Found file of type %(file_type)', file_type='x-type/zomg') 
+0

謝謝!猜猜我也可以檢查相同或非常類似的消息。 –

+1

@Mikkel Jans:是的,這是相當常見的登錄方式。重複的消息將被替換爲「消息重複X次」。你可以很容易地有一個「最後的消息」佔位符和一個計數器。當消息更改時,轉儲一個額外的日誌項目以前一個連續的計數。 –

0

我的理解是,您試圖一次又一次地限制記錄相同的消息。

如果這是您的問題,我會創建一組您已經記錄的file_types。然而,你必須要小心,如果這是要一直運行下去,你最終會崩潰..

from sets import Set 
logged = Set() 
while yourCondition: 
    file_type = get_next_file_type() 
    needToLog = #determine if you need to log this thing 

    if needToLog and (not file_type in logged): 
     logger.info("BAH! " + file_type) 
     logged.add(file_type) 
+0

你有那麼多的parens,是在LISP嗎? :P這段代碼給了我:NameError:name'Set'沒有定義 –

+0

@Rosh Oxymoron有幫助嗎?它的python psuedo代碼:) parens有助於爲我組織;)。像名字一樣)。 – Nix

0

登錄不太重要的事件,以較低的優先級,如DEBUG。請參閱setLevelSysLogHandler

在開發時將級別設置爲DEBUG,隨着應用程序的成熟,將其設置爲更合理的值,如INFO或ERROR。

你的應用程序應該對錯誤做些事情,比如刪除錯誤類型的文件和/或創建缺少文件;或將錯誤配置的目錄從作業輪詢移至隔離位置,因此您的日誌不會被淹沒。

0
import logging 
logger = logging.getLogger(test) 
# logging to a file 
hdlr = logging.FileHandler(test.log) 
formatter = logging.Formatter('%(asctime)s %(filename)s %(lineno)s %(levelname)s % (message)s') 
hdlr.setFormatter(formatter) 
logger.addHandler(hdlr) 
logger.setLevel(logging.DEBUG) 

然後在循環中,您必須檢查文件類型以及文件是否存在。 然後加入:

logger.debug('File Type : %s ' % file_type) 

if file_present: 
    logger.debug('File Present : %s ' % present)