我有一个必须运行多次模拟的应用程序。我想设置一个日志记录机制,其中所有日志记录都记录在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 在模块 Model 中定义如下
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)
然后我使用程序进程资源管理器来跟踪文件处理程序。我看到运行日志出现,但从未消失。
有什么办法可以强制我这么做吗?
你需要打电话.close()
在文件处理程序上。
当你的Run
课程结束,请致电:
handlers = self.log.handlers[:]
for handler in handlers:
self.log.removeHandler(handler)
handler.close()
每次新的日志消息到达时,文件处理程序都会自动重新打开配置的文件名,因此调用handler.close()
有时可能显得徒劳。从记录器中删除处理程序会阻止将来的日志记录发送给它;在上面的代码中,我们首先执行此操作,以避免来自另一个线程重新打开处理程序的不合时宜的日志消息。
这里的另一个答案建议您使用logging.shutdown()
。然而,这一切logging.shutdown()
确实是打电话handler.flush()
and handler.close()
,我会不建议使用它。它使日志记录模块处于无法使用的状态logging.shutdown()
再次,不可靠。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)