EDIT:
Поскольку в файле журнала есть несколько нежелательных строк, а не только "Не найдено ...", я предполагаю, что все допустимые строки начинаются с квадратной скобки, как строки с данными выше.
Сначала я прочитал бы все строки, которые действительны в списке:
log = []
with open ('/wherever/file/may/roam/logfile.log', 'r') as logfile:
for row in logfile.readlines():
if row[0] == '[':
log.append(row)
С помощью StringIO
из io
-модуля вы можете использовать его для создания панд данных:
from io import StringIO
df = pd.read_fwf(StringIO(''.join(log)), colspecs=[(1, 21), (23, None)], header=None)
Вы можете прочитать этот файл журнала с помощью pandas
в кадре данных, подобном этому
импорт панд в виде pd
df = pd.read_fwf ('/ wherever / file / may / roam / logfile.log', colspecs = [(1, 21), (23, None)], комментарий = 'o', заголовок = None)
Здесь я использовал «чтение файла с фиксированной шириной» из-за даты одинаковой длины в начале. Я уже обрезал скобки, прочитав второй символ on (colspecs), поэтому сигнальным символом для строк, пропускаемых с помощью ключевого слова comment, является 'o' из 'Not'. Называйте это неправильным использованием, но это работает здесь хорошо. Тогда header=None
, потому что ваш файл не имеет дескрипторов столбцов в качестве первой строки.
Результатом является этот фрейм данных:
df
0 1
0 22/Aug/2018 10:07:14 "GET /api HTTP/1.1" 404 2318
1 22/Aug/2018 10:30:30 "GET /api HTTP/1.1" 404 2318
2 22/Aug/2018 10:30:33 "GET /api HTTP/1.1" 404 2318
3 22/Aug/2018 10:37:08 "POST /api/entity/ HTTP/1.1" 201 83
4 22/Aug/2018 10:37:40 "GET /api/entity/ HTTP/1.1" 200 412
5 22/Aug/2018 10:37:41 "POST /api/datasets/ HTTP/1.1" 201 115
С
df[0] = pd.to_datetime(df[0])
мы превращаем дату строки типа в формат даты и времени, с которым мы можем вычислить.
Затем нам нужна функция для вычисления n секунд назад от последней записи:
thrshld = lambda n: df[0].values[-1] - n*10**9
Значения даты и времени в df [0] имеют тип numpy.datetime64, который имеет разрешение наносекунды, следовательно, коэффициент 10 ** 9.
Теперь вы можете индексировать ваш фрейм данных как
df[df[0]>thrshld(5)]
Out:
0 1
4 2018-08-22 10:37:40 "GET /api/entity/ HTTP/1.1" 200 412
5 2018-08-22 10:37:41 "POST /api/datasets/ HTTP/1.1" 201 115
df[df[0]>thrshld(60)]
Out:
0 1
3 2018-08-22 10:37:08 "POST /api/entity/ HTTP/1.1" 201 83
4 2018-08-22 10:37:40 "GET /api/entity/ HTTP/1.1" 200 412
5 2018-08-22 10:37:41 "POST /api/datasets/ HTTP/1.1" 201 115