首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python不会将文件句柄释放到日志文件

python不会将文件句柄释放到日志文件
EN

Stack Overflow用户
提问于 2013-03-15 23:02:58
回答 4查看 49.3K关注 0票数 46

我有一个应用程序,它必须运行一些模拟运行。我想设置一个日志记录机制,其中所有日志记录都记录在一个general.log中,模拟运行的所有日志都转到run00001.log,...为此,我定义了一个类运行。在__init__()中,为运行日志添加了一个新的文件句柄。

问题是,运行的日志文件永远不会被释放,因此在多次运行之后,可用句柄耗尽,运行崩溃。

我已经设置了一些例程来测试它,如下所示

主程序

代码语言:javascript
运行
复制
import Model
try:
    myrun = Model.Run('20130315150340_run_49295')
    ha = raw_input('enter')
    myrun.log.info("some info")
except:
    traceback.print_exc(file=sys.stdout)

ha = raw_input('enter3')

类运行在模块模型中定义如下

代码语言:javascript
运行
复制
import logging
class Run(object):

    """ Implements the functionality of a single run. """
    def __init__(self, runid):
        self.logdir="."
        self.runid          = runid
        self.logFile        = os.path.join(self.logdir , self.runid + '.log')
        self.log            = logging.getLogger('Run'+self.runid)
        myformatter         = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
        myhandler      = logging.FileHandler(self.logFile)
        myhandler.setLevel(logging.INFO)
        myhandler.setFormatter(myformatter)
        self.log.addHandler(myhandler) 

然后,我使用程序进程资源管理器来跟踪文件处理程序。我看到运行日志出现,但永远不会消失。

有没有办法我可以强迫你这么做?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-18 18:29:14

您需要在文件处理程序上调用.close()

当您的Run类完成时,调用:

代码语言:javascript
运行
复制
handlers = self.log.handlers[:]
for handler in handlers:
    handler.close()
    self.log.removeHandler(handler)
票数 89
EN

Stack Overflow用户

发布于 2018-11-14 22:58:36

您也可以完全使用shutdown the logging。在这种情况下,文件句柄将被释放:

代码语言:javascript
运行
复制
logging.shutdown()

它关闭所有已配置的日志处理程序的打开的句柄。

我需要它能够在单元测试完成后删除日志文件,并且能够在调用logging.shutdown()方法后立即删除它。

票数 29
EN

Stack Overflow用户

发布于 2019-05-27 03:52:30

我使用的是交互式Python环境(Spyder)。显然,Spyder在内部使用了日志。因此,logging.shutdown()不会产生预期的效果。下一次执行相同的程序时,日志记录翻了一番,第三次执行时日志记录增加了两倍,等等。在这个环境中,处理程序显然不会被shutdown()删除。此外,我没有通过发出显式的shutdown()调用来以任何方式中断Spyder。令人费解。

Martijn显式关闭和删除处理程序的代码在Spyder环境中确实有效。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15435652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档