[英]The best way to filter a log by a dates range in python
打印与日期时间范围匹配的日志行的最佳方法是什么。 例如:
我想只打印日期为:2012/09 / 30-00:00:10到:2012/09 / 30-00:00:13
2012/09/30-00:00:08.773 log error
2012/09/30-00:00:09.034 log warning
2012/09/30-00:00:09.352 log info
2012/09/30-00:00:10.526 log info
2012/09/30-00:00:10.995 log warning
2012/09/30-00:00:12.014 log warning
2012/09/30-00:00:18.035 log error
2012/09/30-00:00:21.733 log fatal
2012/09/30-00:00:21.981 log info
它应该打印:
2012/09/30-00:00:10.526 log line
2012/09/30-00:00:10.995 log line
2012/09/30-00:00:12.014 log line
我想以经济有效的方式做到这一点,因为我正在使用生产服务器。 Python只请。 谢谢!
Actullay,日志格式允许比较日期字符串而不将其转换为datetime
。
with open('mylog.log','r') as f:
for line in f:
d = line.split(" ",1)[0]
if d >= '2012/09/30-00:00:10' and d <= '2012/09/30-00:00:13':
print line
假设您逐行读取日志:
import re
for line in log:
if re.match("2012/09/30-00:00:1[0-3]", line):
print line
我不确定性能影响(我怀疑Tim的答案可能更快),但这种方法适用于任何日期范围:
>>> def dates(start,end):
... for i in range(int((end-start).seconds)):
... yield start + datetime.timedelta(seconds=i)
...
>>> fmt = '%Y/%m/%d-%H:%M:%S'
>>> from_date = datetime.datetime.strptime('2012/09/30-00:00:10',fmt)
>>> till_date = datetime.datetime.strptime('2012/09/30-00:00:13',fmt)
>>> with open('file.log') as f:
... for line in f:
... if datetime.datetime.strptime(line.split()[0][:-4],fmt) in dates(fro
m_date,till_date):
... print line
...
2012/09/30-00:00:10.526 log info
2012/09/30-00:00:10.995 log warning
2012/09/30-00:00:12.014 log warning
prefixes = tuple("2012/09/30-00:00:1%d" % i for i in range(3))
with open('mylog.log', 'rb') as file:
print ''.join(line for line in file if line.startswith(prefixes)),
您可以使用单个静态前缀对其进行优化,然后使用正则表达式或日期时间对象测试预选行。
如果行在输入中按日期排序; 你可以提前打破而不读取整个文件。
根据Tim的假设,您逐行读取日志文件,然后使用itertools
。
from itertools import dropwhile, takewhile
from_dt, to_td = '2012/09/30-00:00:10', '2012/09/30-00:00:13'
with open('logfile') as fin:
of_interest = takewhile(lambda L: L <= to_td, dropwhile(lambda L: L < from_dt, fin))
for line in of_interest:
print line
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.