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

时间:2015-01-15 02:25:04

标签: 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!")

在example.log中我有这个:

01/14/2015 09:16:15 PM Start:
01/14/2015 09:16:20 PM Complete:

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

我的问题:如何在basicConfig中重新格式化datefmt以便在几秒钟内获得时间。我想通过减去两个值来进行简单的操作,并监视它是否太长。 感谢

3 个答案:

答案 0 :(得分:1)

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

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

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

1421288969.379916 Start:
1421288974.385206 Complete:

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

答案 1 :(得分:1)

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

输出结果为:

  

○时00分05秒

stend都是Delorean个对象,时区 UTC ,例如

>>> print st
Delorean(datetime=2015-01-14 21:16:15+00:00, timezone=UTC)

diffdatetime.timedelta个对象,例如

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

答案 2 :(得分:1)

为了便于阅读,我建议您保留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()部分需要Python 3.3或更高版本,但在早期版本中,您可以区分datetime个对象并在该时差对象上调用total_seconds方法。