Как читать журнал время от времени и извлечь конкретную строку, не содержащую информацию о дате - PullRequest
0 голосов
/ 26 ноября 2018

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

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

Меня не волнует нормальный журнал, но я хочу извлечь строку, содержащую слово «Exception», котороеЭто должно быть написано в какой-то момент (например, между 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 ]

0 голосов
/ 26 ноября 2018

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

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('18:\d{2}:\d{2}', prev):
                result[id] = line

print(result)

Вывод:

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

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

0 голосов
/ 26 ноября 2018

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

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