python-3.x - Python日志模块 - 自上次日志以来的时间

标签 python-3.x logging

我想在 Python 的日志记录模块生成的日志中添加自最后一次进入日志以来耗时(秒/毫秒)。

这很有用,因此您可以查看日志文件以查看同一步骤是否总是花费相同的时间或变化,表明环境中发生了某些变化(例如数据库性能)。

我知道 %(relativeCreated)d,但这仅显示自记录器启动以来耗时,而不是自上次创建日志以来的时间。
基本上 %(relativeCreated)d 是累积值,我想看到的是每个 %(relativeCreated)d 之间的差异。

这就是您使用 %(relativeCreated)d 得到的结果:

2015-07-20 12:31:07,037 (7ms) - INFO - Process started....
2015-07-20 12:31:07,116 (87ms) - INFO - Starting working on xyz
2015-07-20 12:31:07,886 (857ms) - INFO - Progress so far

这就是我需要的:
2015-07-20 12:31:07,037 (duration: 7ms) - INFO - Process started....
2015-07-20 12:31:07,116 (duration: 80ms) - INFO - Starting working on xyz
2015-07-20 12:31:07,886 (duration: 770ms) - INFO - Progress so far

最佳答案

扩展@Simeon Visser 的答案——过滤器是一个简单的存储设备,用于存储自脚本启动以来最后一条消息的相对时间(参见self.last 类中的TimeFilter)。

import datetime
import logging

class TimeFilter(logging.Filter):

    def filter(self, record):
        try:
          last = self.last
        except AttributeError:
          last = record.relativeCreated

        delta = datetime.datetime.fromtimestamp(record.relativeCreated/1000.0) - datetime.datetime.fromtimestamp(last/1000.0)

        record.relative = '{0:.2f}'.format(delta.seconds + delta.microseconds/1000000.0)

        self.last = record.relativeCreated
        return True

然后将该过滤器应用于每个日志处理程序并访问每个日志处理程序的日志格式字符串中的相对时间。
fmt = logging.Formatter(fmt="%(asctime)s (%(relative)ss) %(message)s")
log = logging.getLogger()
[hndl.addFilter(TimeFilter()) for hndl in log.handlers]
[hndl.setFormatter(fmt) for hndl in log.handlers]

关于python-3.x - Python日志模块 - 自上次日志以来的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521859/

相关文章:

python - 通过普通类、数据类和命名元组创建对象的有趣性能

python-3.x - 使用 matplotlib 堆积条形图

python - 精确定位收到声音时的样本编号或点

if-statement - IF 语句真值条件

python - 如何使用日志记录 Python 模块写入文件?

logging - 如何为 grails 插件配置日志记录?

python-3.x - python 的最佳 copula 包

asp.net-mvc-4 - 登录 Web 角色 MVC

java - 为每个创建的线程使用不同的日志文件

python - 一次将数组中的每个项目分开