Получить записи из файла журнала за последние n секунд в Python - PullRequest
0 голосов
/ 28 августа 2018

Я хочу проигнорировать "Not Found: / api" и вернуть все вызовы GET и POST в течение последних n введенных секунд

Ниже показано, как выглядит мой файл журнала:

Not Found: /api
[22/Aug/2018 10:07:14] "GET /api HTTP/1.1" 404 2318
Not Found: /api
[22/Aug/2018 10:30:30] "GET /api HTTP/1.1" 404 2318
Not Found: /api
[22/Aug/2018 10:30:33] "GET /api HTTP/1.1" 404 2318
[22/Aug/2018 10:37:08] "POST /api/entity/ HTTP/1.1" 201 83
[22/Aug/2018 10:37:40] "GET /api/entity/ HTTP/1.1" 200 412
[22/Aug/2018 10:37:41] "POST /api/datasets/ HTTP/1.1" 201 115

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

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
0 голосов
/ 28 августа 2018

Если вы используете хвост:

tail somelog.log | grep -E 'GET|POST'

Вы также можете использовать egrep:

tail somelog.log | egrep 'GET|POST'

Вы также можете cat файл журнала и передать ту же команду egrep или grep -E.

...