【问题标题】:How can I write to the previous line in a log file using Python's Logging module?如何使用 Python 的 Logging 模块写入日志文件中的前一行?
【发布时间】:2010-05-15 11:30:03
【问题描述】:

在这里潜伏了好久,终于从木制品里出来了。

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

Connecting to database . . . Done.

我想要“连接到数据库”。 . . ' 函数调用时写,函数执行成功后写 'Done'。

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

【问题讨论】:

    标签: python logging


    【解决方案1】:

    写入日志是并且必须是一个原子操作——这是至关重要的,也是任何日志记录包(包括 Python 标准库中的那个)的一个关键特性,它将日志记录与将信息简单地附加到文件中(其中一些由不同进程和线程编写的东西很可能会“交错”——其中一个写一行的一部分而不是行尾,就像你想要的那样,然后也许另一个人在之后插入一些东西,在第一个任务写下它认为将是该行的最后一部分但实际上结束于另一行之前......通常会导致完全混乱;-)。

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

    对于关于您的任务正在做什么的临时更新(在 X、X 完成、开始 Y 等的中间),您可以考虑一个专门的日志处理程序,(例如)通过获取第一个词作为子任务标识符(逐渐建立并在某处显示关于“当前子任务”的复合消息,识别子任务标识符何时更改前一个子任务已完成或采用明确的“子任务完成”消息,并且只写持久记录子任务完成事件的条目)。

    这是一项非常专业的要求,因此您不太可能为此找到预制工具,而是您必须自己动手。为了帮助您解决这个问题,准确了解您要完成的工作至关重要(如果这样的概念有任何意义,您为什么想要非原子日志记录条目——什么部署或系统您是否试图通过使用这种假设工具来改善管理任务?)以便可以根据您的实际需求定制专门的子系统。那么,您能详细说明一下吗?

    【讨论】:

    • 日志记录背后的理论和实践的优秀总结 :) 谢谢!
    • 哇,谢谢亚历克斯,我真的从你的帖子中学到了很多!现在我对日志记录有了更多了解,我认为非原子日志记录根本不是关键任务,因此我会顺其自然。感谢您的精彩回答!
    【解决方案2】:

    我不相信 Python 的记录器支持这一点。

    但是,最好同意 Log 格式,以便在您要分析数据时可以轻松解析日志文件 where ;是你想要的任何分隔符:

    DateTime;LogType;string
    

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

    如果你使用:

          Connecting to database . . . Done.
    

    那么你将无法分析交易花费了多长时间

    【讨论】:

      【解决方案3】:

      我认为你不应该走这条路。一种带入口的日志记录方法:

        Time;functionName()->
      

      并且退出日志记录对于故障排除更有用:

        Time;functionName()<-
      

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 2016-05-21
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        相关资源
        最近更新 更多