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

use*_*757 4 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()
Run Code Online (Sandbox Code Playgroud)

我遇到的问题:

  1. 脚本运行完毕后,文件仍然存在锁定 在此输入图像描述

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

我第一次运行脚本:

安慰:

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

记录仪,DEBUG.TXT:

Am I duplicating error entries?
Run Code Online (Sandbox Code Playgroud)

我第二次运行脚本: console:

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

记录仪,DEBUG.TXT

Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Run Code Online (Sandbox Code Playgroud)

我第三次运行脚本:

安慰:

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

记录仪,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?
Run Code Online (Sandbox Code Playgroud)

use*_*757 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)
Run Code Online (Sandbox Code Playgroud)

请注意logger.removeHandler(hdlr)新版本.

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

我看到一个旧的Stack Overflow消息,其中包含用于删除所有处理程序的代码.

handlers = logger.handlers[:]
for handler in handlers:
    handler.close()
    logger.removeHandler(handler)
Run Code Online (Sandbox Code Playgroud)