我想在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
答案 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]