Python日志记录模块 - 自上次日志以来的时间

时间:2015-07-20 16:41:00

标签: python-3.x logging

我想在Python的日志模块生成的日志中添加自上次输入日志以来经过的时间(秒/毫秒)。

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

我知道%(relativeCreated)d,但这只显示自记录器启动以来所经过的时间,而不是自上次记录以来。 基本上%(relativeCreated)d是累积值,我希望看到的是每个%(relativeCreated)d之间的差异。

这是你用%(relativeCreated)d:

得到的
$username = 'test\AdminUser1'
$selected_password = 'P@$$word'
$selected_runCommand = 'http:\\QA_env1.com\MainPortal.asp'
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $selected_password -AsPlainText -Force))
$path = $env:programfiles
Start-Process -FilePath "$path\Internet Explorer\iexplore.exe" -LoadUserProfile -Credential $cred -ArgumentList $selected_runCommand

这就是我需要的:

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

2 个答案:

答案 0 :(得分:3)

这可以使用自定义logging.Filter实例完成。以下是使用logaugment库的示例,或者您可以查看at the source来构建类似的内容。

import datetime
import logging

import logaugment

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter("%(time_since_last)s: %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

创建记录器后,您需要指定一个函数,每次创建记录记录时都会调用该函数:

def process_record(record):
    now = datetime.datetime.utcnow()
    try:
        delta = now - process_record.now
    except AttributeError:
        delta = 0
    process_record.now = now
    return {'time_since_last': delta}

logaugment.add(logger, process_record)
logger.warn("My message")

示例:

# 0:00:02.127129: My message

这会将datetime.timedelta对象转换为字符串。您可以使用以下命令将其格式化为以毫秒为单位的值:

try:
    formatted = '{}ms'.format(delta.total_seconds() * 1000)
except AttributeError:
    formatted = '0ms'
return {'time_since_last': formatted}

需要Python 2.7+(total_seconds())。

答案 1 :(得分:2)

扩展@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]