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

时间:2010-05-15 11:30:03

标签: python logging

这里的长期潜伏者,最终从木制品中脱颖而出。

基本上,我正在尝试做的是让我的记录器将这样的数据写入日志文件:

Connecting to database . . . Done.

我想要'连接数据库'。 。 。 '在调用函数时写入,并在函数成功执行后写入'完成'。

我正在使用Python 2.6和日志记录模块。另外,我真的很想避免使用装饰器。任何帮助都将非常感激!

3 个答案:

答案 0 :(得分:11)

写入日志是,并且必须是原子操作 - 这是至关重要的,并且是区分日志记录的任何日志包(包括Python标准库中的日志包)的关键特性简单地将信息附加到文件(其中由不同进程和线程写入的内容可能很好地“交错” - 其中一个写入一部分行而不是行结束,正如您所希望的那样,然后可能在第一个任务写出它认为将是该行的最后一部分但实际上最终在另一条线上之后,另一个插入正确的东西之后......通常会产生混乱; - )。

原子单元是“一条线”并不是不可避免的(当然,日志可以记录在文本文件的其他地方,而日志中可接受的一些“下沉”甚至没有< em>概念的“一行”!),但是,对于日志记录,必须的原子单位。如果你想要整个非原子的东西,那么你真的不想要记录,而是简单地附加到文件或其他流(并注意第一段中提到的可能的混淆; - )。

对于关于你的任务正在做什么的瞬态更新(在X中间,X完成,开始Y等),你可以想到一个专门的日志处理程序(例如)通过采取这个来解释这样的更新流。第一个单词作为子任务标识符(逐步构建并显示关于“当前子任务”的复合消息),识别子任务标识符何时更改前一个子任务完成或采用显式“子任务完成”消息,并且仅写入持久性子任务完成事件的日志条目。

这是一个非常专业的要求,因此您不太可能找到预制的工具,而是您必须自己动手。为了帮助您,了解您正在尝试完成的内容至关重要(如果这样的概念甚至没有任何意义,您为什么要想要非原子日志记录条目 - 什么部署或系统管理任务是你试图通过使用这样一个假设的工具改进?),以便专门的子系统可以根据您的实际需求进行定制。那么,请你扩展一下吗?

答案 1 :(得分:8)

我不相信Python的记录器支持它。

然而,对于日志格式进行聚合会不会更好,这样当您想要分析数据时,可以很容易地解析日志文件;是你想要的任何决定者:

DateTime;LogType;string

可以通过脚本轻松解析,然后您可以对日志进行分析

如果您使用:

      Connecting to database . . . Done.

然后您将无法分析交易花费的时间

答案 2 :(得分:3)

我认为你不应该走这条路。带有条目的记录方法:

  Time;functionName()->

退出记录对于故障排除更有用:

  Time;functionName()<-