Spyder 中重复的日志条目和锁定的日志文件 IDE

Duplicate log entries and locked log files in Spyder IDE

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

一旦 python 脚本完成 运行ning,我希望能够 delete/edit 日志文件。我在 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. 脚本完成后运行ning,文件上仍然有锁

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

我第一次运行脚本:

控制台:

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

记录器-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?

记录器-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?

记录器-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?

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

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

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

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)

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

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

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

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

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

锁将一直存在,直到您关闭并删除所有处理程序,或者您终止 Python 实例/"tab"。

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

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