Как читать время файла журнала по времени и извлекать конкретную строку, не содержащую информацию о дате

У меня есть файл журнала, и формат его будет таким,

INFO    2018/11/20 18:56:00 aaaaaaaaaaaaaaaaaaaaaaaaaaaa
INFO    2018/11/20 18:56:00 bbbbbbbbbbbbbbbbbbbbbb
INFO    2018/11/20 18:56:00 cccccccccccccccccccccccccccc
INFO    2018/11/20 18:56:00 ddddddddddddddddddddddd
WARN    2018/11/20 18:56:23 Some Error Message
java.lang.IllegalArgumentException: blahblahblah
INFO    2018/11/20 19:01:23 eeeeeeeeeeeeeeeeeeeeeeeee

Мне не нужен обычный журнал, но я хочу извлечь строку, содержащую слово «Исключение», которое может быть написано в какой-то момент (например, между 18:00:00 и 18:59:59.) Что я думал сначала нужно было получить индекс, используя функцию перечисления при чтении файла журнала. Но с этим я должен прочитать файл по крайней мере три раза. А также функции linecache загружают каждую строку в файл в памяти. Некоторые файлы более 100 МБ, поэтому я знаю, что это плохая идея.

start = 0
end = 0
with open("filename", "f") as f:
    for idx, line in enumerate(f):
        if re.search("2018(/|:|)11(/|:|)20 18:d{2}:d{2}", line):
            start = idx
            break

    for idx, line in enumerate(f):
        if re.search("2018(/|:|)11(/|:|)20 19:d{2}:d{2}", line):
            end = idx - 1
            break    

for i in range(start, end):
    line = linecache.getline("filename", i)
    if 'Exception' in line:
        print line

Самая важная проблема заключается в том, что журналы не всегда записываются на xx: 00m или xx: 59m. Например, он будет запущен 18:01:00 или 18:03:31 ..

С тех пор я не придумал никакой хорошей идеи. Пожалуйста, помогите мне .. Спасибо заранее.

Всего 2 ответа


Вам не нужно три раза перебирать файл. Просто поддерживайте текущую и предыдущую строку в своем цикле.

from collections import OrderedDict
import re

result = OrderedDict()

with open("filename", "r") as f:
    prev, curr = None, None
    for id, line in enumerate(f):
        prev = curr
        curr = line
        if re.search('Exception', line):
            if re.search(ཎ:d{2}:d{2}', prev):
                result[id] = line

print(result)

Выход:

OrderedDict([(5, 'java.lang.IllegalArgumentException: blahblahblah
')])

Если вы хотите получить номер строки из всех 1-часовых интервалов из вашего файла журнала, вам просто нужно заменить '18' на некоторую переменную.


Можете ли вы просто прочитать файл по строкам?

with open('test.txt', 'r') as f:
    lines = f.readlines()
for line in lines:
    if line.find('Exception') >= 0:
        print(line)

Есть идеи?

10000