【问题标题】:Python Logging - closing filehandlers for multiple modulesPython Logging - 关闭多个模块的文件处理程序
【发布时间】:2017-05-02 05:31:16
【问题描述】:

我正在尝试从我创建的多个模块中记录信息。我有一个主脚本(main.py)和另一个模块(我们称之为mymodule.py)。我在每个模块中设置了一个记录器,如下所示:

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# create a file handler
file_handler = logging.FileHandler('debug.log', mode='a')
file_handler.setLevel(logging.DEBUG)

# create a logging format
# we're limiting the levelname to 1 char: I=INFO, D=DEBUG and so on
formatter = logging.Formatter('[%(levelname).1s][%(module)14s:%(funcName)-15s]-> %(message)s')
file_handler.setFormatter(formatter)

# add the handler to the logger
logger.addHandler(file_handler)

在 main.py 中,我加载 mymodule.py,并在所有处理结束时执行以下操作。

file_handler.close()
logger.removeHandler(file_handler)

现在的问题是,一旦脚本停止运行,除非我关闭 Spyder,否则我无法删除 debug.log。此外,对于随后的每次运行,我都会像这样从mymodule.py 获得重复的条目。

[D][mymodule:__init__       ]-> object created
[D][mymodule:__init__       ]-> object created

因此,我似乎有一个打开的文件处理程序挂起。我该如何关闭它。如果我必须在mymodule.py 中添加file_handler.close(),我应该在哪里添加?

编辑:我在 main.py 中尝试过这个

# clean up file handlers
handlers = logger.handlers[:]
for handler in handlers:
    handler.close()
    logger.removeHandler(handler)

【问题讨论】:

  • 你检查过logger.handlers 看看你最后确实删除了所有处理程序吗?
  • 我尝试更新 main.py。请参阅已编辑的问题。这没有帮助。
  • 使用logging,如下所述:docs.python.org/3.6/howto/…
  • 如果我不使用自定义记录器但我想使用自定义记录器,我可以使用该方法。

标签: python logging filehandler


【解决方案1】:

如果您使用的是 Spyder,那么您的变量可能在工作区的整个生命周期内都是有效的。你应该删除变量file_handler:

file_handler.close()
del file_handler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2017-12-11
    • 2017-05-23
    相关资源
    最近更新 更多