持续循环中的日志记录

5 投票
5 回答
6560 浏览
提问于 2025-04-16 20:26

有什么好的方法可以在一个持续运行的循环中使用Python的日志模块来创建日志,而不产生大量无用的日志文件呢?

举个例子,假设有一个循环,它不断检查一个文件夹,当看到某种特定类型的文件时就会执行一些操作。我想记录一下没有找到文件,或者找到了文件但类型不对的情况,但又不想在每次检查文件夹的时候都重复记录同样的内容,因为这个循环可能每秒会运行很多次。

5 个回答

0

记录一些不太重要的事件,比如DEBUG级别的日志。你可以查看setLevelSysLogHandler来了解更多。

在开发阶段,可以把日志级别设置为DEBUG,这样可以看到更多的细节。等到你的应用程序逐渐成熟后,可以把级别调整为更合适的值,比如INFO或者ERROR。

你的应用程序应该对错误做一些处理,比如删除错误类型的文件,或者创建缺失的文件;还可以把配置错误的目录从任务轮询中移到一个隔离的位置,这样你的日志就不会被淹没了。

0

我的理解是,你想要限制同样的信息被重复记录多次。

如果这是你的问题,我建议你创建一个已经记录过的文件类型的集合。不过你需要小心,如果这个程序一直运行下去,最终可能会崩溃。

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)
4

创建一个Handler,这个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')

撰写回答