一尘不染

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

python

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

问题在于,运行的日志文件永远不会释放,因此在运行了许多次之后,可用的句柄就用光了,运行崩溃了。

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

主程序

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')

类Run在模块模型中定义如下

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)

然后,我使用程序进程浏览器来跟踪文件处理程序。而且我看到了运行日志,但从未消失。

有什么办法可以强迫我吗?


阅读 257

收藏
2020-12-20

共1个答案

一尘不染

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

当你的Run类完成后,调用:

handlers = self.log.handlers[:]
for handler in handlers:
    handler.close()
    self.log.removeHandler(handler)
2020-12-20