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

时间:2016-01-01 09:24:50

标签: python windows logging spyder

我想要的:我的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. 脚本运行完毕后,文件仍然存在锁定 enter image description here

  2. 每次运行脚本时,日志文件都会生成许多重复的条目。

  3. 我第一次运行脚本:

    控制台:

    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?
    

4 个答案:

答案 0 :(得分:7)

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

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

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 ),因此许多处理程序同时编写了相同的错误消息。这意味着我必须使用覆盖文件模式,我也可以使用append filemode。

我看到old Stack Overflow message有一些删除所有处理程序的代码。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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