在常量運行循環內創建日誌(使用python日誌記錄模塊)的好方法是什麼,而不會產生大量無用的日誌文件? 一個例子就是一個循環,它會持續列出一個文件夾,並在看到一個特定類型的文件時執行一些操作。 我想記錄沒有找到文件,或者找到了文件但類型錯誤,而且每次檢查文件夾時都不會記錄相同的行,因爲它可能每秒運行多次。登錄連續循環
登錄連續循環
回答
創建你所需要的任何其他功能的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')
謝謝!猜猜我也可以檢查相同或非常類似的消息。 –
@Mikkel Jans:是的,這是相當常見的登錄方式。重複的消息將被替換爲「消息重複X次」。你可以很容易地有一個「最後的消息」佔位符和一個計數器。當消息更改時,轉儲一個額外的日誌項目以前一個連續的計數。 –
我的理解是,您試圖一次又一次地限制記錄相同的消息。
如果這是您的問題,我會創建一組您已經記錄的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)
你有那麼多的parens,是在LISP嗎? :P這段代碼給了我:NameError:name'Set'沒有定義 –
@Rosh Oxymoron有幫助嗎?它的python psuedo代碼:) parens有助於爲我組織;)。像名字一樣)。 – Nix
登錄不太重要的事件,以較低的優先級,如DEBUG。請參閱setLevel和SysLogHandler。
在開發時將級別設置爲DEBUG,隨着應用程序的成熟,將其設置爲更合理的值,如INFO或ERROR。
你的應用程序應該對錯誤做些事情,比如刪除錯誤類型的文件和/或創建缺少文件;或將錯誤配置的目錄從作業輪詢移至隔離位置,因此您的日誌不會被淹沒。
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)
- 1. 連續登錄F#
- 2. 連續循環UIScrollViews?
- 3. 連續CountDownTimer循環
- 4. while循環登錄
- 5. Jmock循環連續調用
- 6. 連續循環執行runnable
- 7. UICollectionView水平連續循環
- 8. 在java中連續循環
- 9. Gnuplot循環連續變量
- 10. AJAX調用連續循環?
- 11. 定時器連續循環
- 12. FETCH_ASSOC PDO連續循環
- 13. 在F#F#連續循環
- 14. 連續ImageViews在循環中
- 15. imacros |登錄和循環(第二循環)
- 16. Jquery移動登錄循環
- 17. ubuntu登錄循環13.10
- 18. Ubuntu 14.04登錄循環
- 19. Facebook登錄循環周圍
- 20. Drupal 7 Chrome登錄循環
- 21. Facebook登錄無限循環
- 22. CakePHP - 無限循環登錄
- 23. Windows 7 Ent登錄循環
- 24. joomla 3.後臺管理員登錄失效 - 繼續循環
- 25. 循環訪問MSAccess中的連續記錄
- 26. Laravel:曲目編號OS連續登錄
- 27. NET_SFTP做連續登錄不工作時
- 28. ASP.NET阻止用戶連續登錄
- 29. 對於非連續範圍的循環
- 30. 連續循環代碼Java中
您是在查找「if」語句嗎? – Gandi
請嘗試更好地解釋它。 – juankysmith
你能否澄清你的問題...所以你想讓它在循環中每隔500次記錄一次?或者您是否希望只在郵件發生變化時才進行登錄? – EdoDodo