如何使用Python的Logging模块向日志文件中的上一行写入内容?

8

我是一个长期潜水者,在此终于浮出水面。

本质上,我想要实现的是让我的日志记录器将数据以以下方式写入日志文件:

Connecting to database . . . Done.

当调用函数时,我希望显示“连接到数据库......”,并在函数成功执行后显示“完成”。

我正在使用Python 2.6和日志记录模块。此外,我真的不想使用装饰器来实现这个功能。非常感谢您的帮助!

3个回答

16

写入日志必须是原子操作,这一点至关重要,也是任何记录包(包括Python标准库中的包)区别于简单地向文件追加信息的关键特性。在后者中,不同进程和线程写入的内容可能会“交错”,一个任务只写一行的部分内容而没有行尾,另一个任务可能在此之后插入某些内容,然后第一个任务可能认为最后一部分已经写完了但实际上却被写到了另一行……通常会导致混乱。

原子单位不一定是“一行”(当然,日志可以记录到文本文件之外的其他地方,并且一些适合作为日志记录的事情甚至没有“一行”的概念!),但是对于日志记录来说,必须有原子单位。如果您想要完全非原子的东西,那么您实际上并不需要日志记录,只需要向文件或其他流进行简单的追加。(同时要注意第一段提到的可能的混乱)

对于关于任务正在执行的瞬时更新(例如,在X的中间,X完成,开始Y等),您可以考虑使用专门的日志处理程序,通过将第一个单词视为子任务标识符(逐步构建并在某处显示“当前子任务”的组合消息,在子任务标识符更改时识别前一个子任务已完成或接收显式的“子任务完成”消息,并仅在子任务完成事件上编写持久性日志条目来解释此类更新流)。

这是一个相当专业化的要求,因此您不太可能找到预制的工具,而是需要自己设计。为了帮助您完成这个过程,关键是确切地了解您要完成的任务(如果这样的概念甚至有任何意义,您为什么会想要非原子的日志记录条目-通过使用这样的假设工具,您正在试图改善哪个部署或系统管理任务?),以便为您的实际需求量身定制专门的子系统。因此,请详细说明一下问题。


1
非常好的日志记录理论和实践总结 :) 谢谢! - stw_dev
1
哇,谢谢Alex,我从你的帖子中学到了很多!现在我对日志记录有了更多的了解,我决定非原子性日志记录并不是至关重要的,因此我会让它保持原样。感谢你的好答案! - turvyc

8

我不认为Python的日志记录器支持这个功能。

然而,是否最好达成一个日志格式协议,这样当你想要分析数据时,日志文件可以被轻松解析,其中;是任何你想要的分隔符:

DateTime;LogType;string

这可以轻易地被脚本解析,然后您可以对日志进行分析。

如果使用:

      Connecting to database . . . Done.

那么您将无法分析交易所花费的时间。


3

我认为你不应该选择这条路。一个带有输入的日志记录方法:

  Time;functionName()->

退出日志对故障排除更有用:

  Time;functionName()<-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接