2011-06-28 97 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)