【发布时间】:2017-10-16 03:42:33
【问题描述】:
目前我用于记录一个自定义日志系统,其工作方式如下:
我有一个类似于以下内容的日志class:
class Log:
def __init__(self):
self.script = ""
self.datetime = datetime.datetime.now().replace(second=0, microsecond=0)
self.mssg = ""
self.mssg_detail = ""
self.err = ""
self.err_detail = ""
我创建了一个函数装饰器,它在函数调用上执行try/except,并相应地在Log 对象上向.mssg 或.err 添加一条消息。
def logging(fun):
@functools.wraps(fun)
def inner(self, *args):
try:
f = fun(self, *args)
self.logger.mssg += fun.__name__ +" :ok, "
return f
except Exception as e:
self.logger.err += fun.__name__ +": error: "+str(e.args)
return inner
所以通常一个脚本是一个由多个按顺序运行的方法组成的类。 因此我运行这些方法(如上面提到的装饰),最后我将 Log 对象上传到 mysql 数据库中。
这很好用。但现在我想修改这些项目,使它们与 python 的“官方”日志模块集成。
我不喜欢该模块的地方在于,无法将消息“保存”到 1 个日志对象上,以便仅在运行结束时上传/保存到日志。相反,每个日志调用都会将消息写入/发送到文件等 - 这有时会产生很多性能问题。我可以使用handlers.MemoryHandler,但它似乎仍然不像我原来的系统那样运行:据说它会定期收集消息并将它们刷新到另一个处理程序 - 这不是我想要的:我想收集内存中的消息并根据请求使用显式函数刷新它们。
有人有什么建议吗?
【问题讨论】:
-
顺便说一下,你应该在你的装饰器中重新引发异常。
-
@Laurent LAPORTE 不,重点是脚本一直运行到最后,以便能够上传日志......
-
这是您的选择,但不是一个好的做法。例如,您如何处理
KeyboardInterrupt? -
"但是现在我想修改这些项目,以便它们与 python 的“官方”日志记录模块集成。"你的意思是?为什么要这样做?
-
我的意思是装饰器方法中的表达式
self.logger.err += fun.__name__ +": error: "+str(e.args)等将被logging.error(fun.__name__ +": error: "+str(e.args))替换。类似地,Log类声明将被basicConfig日志声明替换。我这样做是因为我需要将我的代码与另一个使用主要 python 日志记录模块的库集成。
标签: python