我有一个应用程序必须运行一些模拟运行。我想设置一个日志记录机制,其中所有日志记录都记录在general.log中,并且模拟运行的所有日志都转到run00001.log,....为此,我定义了一个Run类。在__init__()中为runlog添加了一个新的文件句柄。python不释放文件句柄到日志文件
问题是运行的日志文件永远不会被释放,所以经过多次运行后,可用的句柄耗尽,运行崩溃。
我已经建立了一些程序来测试这个如下
主程序
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')
类运行的模块型号定义如下
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)
然后我用的是程序进程资源管理器跟随文件处理程序。我看到runlogs出现,但从不消失。
有没有办法强制这个?
2013-03-15
Bart P.
+1
为什么不能再删除处理程序运行完成的时候?想必你可以勾起那个事件? –
2013-03-15 15:04:43
+0
有关如何做到这一点的任何建议?我已经尝试在__del __()中指定self.log.removeHandler(myhandler),即使通过显式调用析构函数(myrun .__ del __())。我也试过在__exit __()中指定并使用with语句,正如打开文件句柄所建议的那样。但迄今为止没有成功。 –
2013-03-15 19:21:32
+1
您还需要在文件处理程序上调用'.close()'。 'self.log.handlers [0] .close()'应该够了,真的。 –
2013-03-15 20:47:18