持续循环中的日志记录
有什么好的方法可以在一个持续运行的循环中使用Python的日志模块来创建日志,而不产生大量无用的日志文件呢?
举个例子,假设有一个循环,它不断检查一个文件夹,当看到某种特定类型的文件时就会执行一些操作。我想记录一下没有找到文件,或者找到了文件但类型不对的情况,但又不想在每次检查文件夹的时候都重复记录同样的内容,因为这个循环可能每秒会运行很多次。
5 个回答
0
记录一些不太重要的事件,比如DEBUG级别的日志。你可以查看setLevel和SysLogHandler来了解更多。
在开发阶段,可以把日志级别设置为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')