如果禁用记录器,则禁止创建空日志文件

时间:2013-10-29 09:55:53

标签: python logging

我正在使用日志记录模块使用以下代码在单独的日志文件中编写错误和调试消息。但我希望只有在设置了特定的环境变量时才会发生日志记录。在下面的代码中,我通过设置logger.disabled=True关闭了日志记录。但是,我观察到当我的应用程序完成执行时,会出现空的日志文件。我在设置logger.disabled=True语句后添加了一个检查以删除这些文件,但它说文件不存在。什么时候生成这些文件 - 即使禁用了记录器,在脚本执行结束时,是否可以防止写入空文件?

class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level
    def filter(self, record):
        return record.levelno == self.level

logger = logging.getLogger("exceptionsLogger")
debugLogFileHandler = logging.FileHandler("Debug.log", mode='w')
errorLogFileHandler = logging.FileHandler("Error.Log", mode='w')
formatter = logging.Formatter('%(message)s')
errorLogFileHandler.setFormatter(formatter)
debugLogFileHandler.setFormatter(formatter)
logger.addHandler(debugLogFileHandler)
logger.addHandler(errorLogFileHandler)
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR))

logger.setLevel(logging.DEBUG)
logger.disabled = True

1 个答案:

答案 0 :(得分:3)

请参阅Python标准库中的logging/__init__.py。类FileHandler有方法__init__()

FileHandler.__init__具有参数delay,它使处理程序延迟创建实际的StreamHandler,直到第一个消息发出。您不使用此参数,并在实例化open()实例时以模式“w”调用FileHandler。在将logger.disabled设置为True之前,请执行此操作。

所以,如果你以后没有发出消息,你仍然已经打开了空文件。

要避免这种情况,要么创建带有参数延迟的文件处理程序,然后传递True或实例化,并仅在需要时分配处理程序。 logger.disabled无法帮助您避免创建文件。