【问题标题】:Duplicate log entries and locked log files in Spyder IDESpyder IDE 中的重复日志条目和锁定的日志文件
【发布时间】:2016-04-05 22:19:00
【问题描述】:

我想要什么:我的 python 脚本运行,将日志消息输出到控制台和文件。

一旦 python 脚本完成运行,我希望能够删除/编辑日志文件。我在 Windows7 上使用 Spyder IDE。

示例代码:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

hdlr = logging.FileHandler("/Users/mds/Dropbox/_python/logger-debug.txt")
logger.addHandler(hdlr) 

logger.error("Am I duplicating error entries?")

hdlr.close()

我遇到的问题:

  1. 脚本运行完毕后,文件上仍有锁

  2. 每次我运行脚本时,日志文件都会增加许多重复条目。

我第一次运行脚本时:

控制台:

runfile('C:/Users/mds/Dropbox/_python/logger-debugger.py', wdir='C:/Users/mds/Dropbox/_python')
ERROR:__main__:Am I duplicating error entries?

logger-debug.txt:

Am I duplicating error entries?

我第二次运行脚本: 控制台:

runfile('C:/Users/mds/Dropbox/_python/logger-debugger.py', wdir='C:/Users/mds/Dropbox/_python')
ERROR:__main__:Am I duplicating error entries?

logger-debug.txt

Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?

我第三次运行脚本:

控制台:

runfile('C:/Users/mds/Dropbox/_python/logger-debugger.py', wdir='C:/Users/mds/Dropbox/_python')
ERROR:__main__:Am I duplicating error entries?

logger-debug.txt

Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?

【问题讨论】:

  • 你的代码真的那么简单吗?
  • @AlastairMcCormack 代码片段正是展示我在实际程序中的问题所必需的。
  • 文件被锁定表明您的 Python 代码仍在运行,因为我从未见过在程序退出后保持锁定。可以用任务管理器验证吗?
  • @AlastairMcCormack 我正在 Spyder IDE 中运行脚本。只有在我关闭 Spyder 后,文件才会释放。但我试图在脚本本身 hdlr.close() 中显式释放文件
  • 能否在关闭前运行 removehandler

标签: python windows logging spyder


【解决方案1】:

显然仅仅关闭处理程序是不够的。它还需要从记录器实例中删除。

所以现在最后一个正确的例子是:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

"""remember to close this handler at finish!!!"""
hdlr = logging.FileHandler("/Users/mds/Dropbox/_python/logger-debug.txt")
logger.addHandler(hdlr) 


logger.error("Am I duplicating error entries?")

hdlr.close()
logger.removeHandler(hdlr)

注意新版本中的logger.removeHandler(hdlr)

所以这解决了锁定文件的问题。它还解决了多次运行脚本多次写入相同日志消息的问题。现在很明显这种情况正在发生,因为仍然有多个文件处理程序链接到该记录器实例 (ma​​in),因此许多处理程序同时写入了相同的错误消息。这意味着我确实不必必须使用覆盖文件模式,我也可以使用附加文件模式。

我看到一个old Stack Overflow message 有这段代码用于删除所有处理程序。

handlers = logger.handlers[:]
for handler in handlers:
    handler.close()
    logger.removeHandler(handler)

【讨论】:

    【解决方案2】:

    Spyder IDE 使用 Python 的持久实例,您可以在其中运行脚本并与之交互。每次运行脚本时,都会使用相同的实例 - 不会清除任何对象。

    日志重复是因为您有效地将多个处理程序添加到同一个记录器。

    锁定将一直存在,直到您关闭并删除所有处理程序,或者您终止 Python 实例/“选项卡”。

    【讨论】:

      【解决方案3】:

      正如 Alastair 所说,默认情况下 spyder 在重新运行脚本时不会清除所有变量,因此每次都会添加处理程序。为避免这种情况,对于您的情况,您只需在添加一个之前检查处理程序列表是否为空:

      if len(logger.handlers) == 0 :
         logger.addHandler(hdlr) 
      

      【讨论】:

        【解决方案4】:

        对于 2,您可以使用 mode='w' 而不是 althea 默认附加模式调用 Filehandler。

        【讨论】:

        • 是的,这消除了问题。虽然如果我想追加而不是覆盖,我仍然不明白为什么每次写入除了添加新行之外,似乎都会重新复制先前编写的行。
        • 而且文件锁定仍然是个问题。在我关闭 IDE 之前无法删除文件。
        • 您可以使用其他文件位置吗?我在 Dropbox 上看到过类似的问题
        • Dropbox 不是问题。我必须从记录器中删除文件处理程序,而不仅仅是关闭它们。意味着我也不需要设置文件模式。
        猜你喜欢
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多