在python中使用日志模块进行时间格式化

2024-09-28 17:21:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我计划使用日志模块来监视每个脚本执行(事件)的运行时间。 我用了这个代码:

import logging
import time

logging.basicConfig(filename='example.log', filemode='w', format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO)
logging.info('Start:')
time.sleep(5)
logging.info('Complete:')

print("Hello World!")

在示例.log我有这个:

^{pr2}$

我的目标是:我想计算所用的时间,即完成和开始之间的时间,我不能轻易地减去09:16:20 PM-09:16:15 PM。在

我的问题是:如何在basicConfig中重新格式化datefmt,以便以秒为单位获得时间。我想做一个简单的操作,减去两个值,当它太长时进行监控。 谢谢


Tags: 模块代码importinfo脚本logtimelogging
3条回答

您可以尝试使用以下格式调用basicConfig

logging.basicConfig(filename='example.log', filemode='w', format='%(created)f %(message)s', level=logging.INFO)

这将生成以下日志条目(您的时间将明显不同):

^{pr2}$

我从你的问题推断出,你将在之后解析日志文件来计算持续时间。%(created)f产生自epoch以来经过的秒数作为浮点值,因此希望这将有助于您的计算。在

Delorean可以帮助您解析和转换为常规的timedate对象,因此您可以确定增量。在

以下代码采用日志中的格式,可以计算增量:

from delorean import Delorean
from delorean import parse

st = parse("01/14/2015 09:16:15 PM")
end = parse("01/14/2015 09:16:20 PM")

diff = end.naive() - st.naive()

print diff

输出为:

0:00:05

stend都是时区UTCDelorean对象,例如

^{pr2}$

diff是一个datetime.timedelta对象,例如

>>> diff = end.naive() - st.naive()
>>> type(diff)
<type 'datetime.timedelta'>

为了可读性,我建议您保留basicConfig原样,稍后当您阅读日志时,通过datetime解析来提取日期和时间。E、 g组:

>>> import datetime
>>> datefmt = '%m/%d/%Y %I:%M:%S %p'  # the same you used for logging
>>> logline = '01/14/2015 09:16:15 PM Start:'  # as read from the log
>>> datetime.datetime.strptime(' '.join(x.split()[:3]), datefmt)
datetime.datetime(2015, 1, 14, 21, 16, 15)
>>> _.timestamp()
1421298975.0

这是你从纪元开始的秒数,因此很容易获得日志中连续行的时间戳之间的秒数差。(.timestamp()部分需要Python3.3或更高版本,但在早期版本中,您可以使用datetime对象之间的差异,并对该时间差对象调用total_seconds方法)。在

相关问题 更多 >