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

标签 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

最佳答案

参见 Python 标准库中的 logging/__init__.py。有一个 FileHandler 类,它有一个方法 __init__()

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

因此,即使您稍后不发送消息,您仍然已经打开了一个空文件。

要避免这种情况,可以使用参数 delay=True 创建文件处理程序,或者仅在需要时实例化和分配处理程序。 logger.disabled 不会帮助您避免创建文件。

关于python - 如果禁用记录器,则防止创建空日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19654864/

相关文章:

logging - Syslog-ng 仅转发原始日志

python - 为什么Gurobi中探索的节点数显示为零?

java - 像 Java "instance-filtering"[RabbitMQ] 这样处理消息的最 Pythonic 方式是什么

java - Log4j FileAppender 创建空文件

java mail aws smtp : javax. mail.AuthenticationFailedException:220准备启动TLS

python - Python 日志记录应该如何使用跨多个模块的日志记录对象来完成?

node.js - 使用 nodejs bunyan 正确记录错误?

python - Django ORM : Why would Django use SELECT (1) on its own?

python - numpy.pad() 函数是否有相反/相反的功能?

python - 无法格式化字符串