4

日時範囲に一致するログ行を印刷する最良の方法は何ですか? 例えば:

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のみでお願いします。ありがとう!

4

5 に答える 5

7

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
于 2012-09-30T10:33:21.510 に答える
1

ログを 1 行ずつ読んでいるとします。

import re
for line in log:
    if re.match("2012/09/30-00:00:1[0-3]", line):
        print line
于 2012-09-30T09:41:51.200 に答える
1

パフォーマンスへの影響についてはわかりませんが (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
于 2012-09-30T09:50:13.617 に答える
0

.startswith():

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

単一の静的プレフィックスを使用して最適化し、後で正規表現または日時オブジェクトを使用して事前に選択された行をテストできます。

入力で行が日付順にソートされている場合。ファイル全体を読み取らずに、以前に中断する可能性があります。

于 2012-09-30T11:53:47.753 に答える
0

ティムの仮定によると、ログ ファイルを 1 行ずつ読み込んでから、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
于 2012-09-30T12:20:17.677 に答える