2012-09-30 39 views
2

打印與日期時間範圍匹配的日誌行的最佳方式是什麼? 例如:按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。 謝謝!

回答

1

假設你逐行讀取日誌行:

import re 
for line in log: 
    if re.match("2012/09/30-00:00:1[0-3]", line): 
     print line 
1

我不知道對性能的影響(我懷疑添的回答可能會更快),但這種方法適用於任何日期範圍:

>>> 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 
+0

只是一個建議:如果你用''''而不是空格分開,那麼你的代碼可以更簡單一些,從而避免了字符串切片操作的需要。 – Will

6

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 
+3

或利用Python條件系統並使用'if'2012/09/30-00:00:10'<= d <='2012/09/30-00:00:13'' –

+0

@JonClements您的評論真的很好。我投了票。謝謝。 –

0

.startswith() example

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)), 

您可以通過使用一個靜態的前綴,再後來在測試中使用正則表達式或預選線datetime對象優化。

如果行在輸入中按日期排序;你可以在不閱讀整個文件的情況下早點休息。

0

根據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