如何使用Python的Logging模块在日志文件中写入上一行?
我在这里潜水很久了,终于冒出来了。
简单来说,我想让我的日志记录器把数据写成这样的格式到日志文件里:
Connecting to database . . . Done.
我希望在调用这个函数的时候能写上“正在连接数据库 . . . ”,然后在函数成功执行后写上“完成”。
我使用的是Python 2.6和日志模块。另外,我真的不想用装饰器来实现这个功能。任何帮助都非常感谢!
3 个回答
我觉得你不应该走这条路。使用一种记录日志的方法,记录进入的情况:
Time;functionName()->
还有退出的日志,这样在排查问题时会更有帮助:
Time;functionName()<-
我觉得Python的日志记录器不支持这个功能。
不过,大家是不是应该统一一下日志格式,这样在分析数据的时候,日志文件就能更容易地被解析。你可以选择任何你想要的分隔符,比如说“;”:
DateTime;LogType;string
这样就可以很容易地通过脚本进行解析,然后你就可以对日志进行分析了。
如果你使用:
Connecting to database . . . Done.
那么你就无法分析交易花了多长时间。
写日志的过程必须是一个原子操作,这一点非常重要,也是任何日志记录工具的关键特性(包括Python标准库中的日志工具)。这与简单地把信息追加到文件中不同,因为在文件中,不同的进程和线程写入的内容可能会“交错”在一起。比如,一个进程可能正在写一行的某一部分,但还没写完这一行的结束符,接着另一个进程就插入了一些内容,这样就会导致混乱,最终结果可能是日志内容变得难以理解。
虽然原子单位不一定非得是“一行”(日志可以记录到其他地方,而有些记录日志的地方根本没有“一行”这个概念!),但对于日志来说,原子单位是必须的。如果你想要的不是原子操作,而是简单地把内容追加到文件或其他流中,那么你其实并不需要日志记录,而只是想要简单的文件追加操作(这可能会引起前面提到的混乱)。
如果你想要关于任务进展的临时更新(比如正在进行X,X完成,开始Y等),你可以考虑一个专门的日志处理器,它可以解析这些更新流。比如,它可以把第一个词当作子任务标识符,逐步构建并显示关于“当前子任务”的综合消息,并在子任务标识符变化时,识别出上一个子任务已经完成,或者接收到一个明确的“子任务完成”消息,然后只在子任务完成事件时写入持久的日志条目。
这个需求比较特殊,所以你可能找不到现成的工具,而是需要自己动手去实现。为了帮助你做到这一点,理解你想要达成的目标非常重要(如果非原子日志条目这个概念真的有意义的话,你为什么会想要它呢?你想通过这种假设的工具来改善什么部署或系统管理任务?)这样才能让这个专门的子系统更好地满足你的实际需求。那么,你能详细说明一下吗?