Парсинг логов Nginx

Я пытаюсь использовать Python для анализа файла журнала ошибок Nginx, чтобы определить, произошло ли что-то за последние 15 минут, а затем выполнить некоторые действия на основе этого.

Мне пока нечего показать, потому что я совершенно не уверен, как это сделать. У меня есть остальная часть моего сценария, в том смысле, что он делает все, что мне нужно, кроме разбора файла журнала. Я просмотрел Google и SO, но не нашел ничего, что могло бы мне помочь. Я понял, как проверить последние 10 строк, но это не решает проблему времени.

Я надеюсь, что кто-то может дать мне какое-то направление. Или пример того, как анализировать файл журнала, включая время и сообщение об ошибке * показано ниже как error I need to find

Я знаю, что кода нет, и SO обычно хочет код, хотя мне нечего показать для этой части сценария, и я не думаю, что есть лучшее место для обмена стеками, чтобы задать этот вопрос. Кажется немного базовым для разработки программного обеспечения.

Это пример записи файла журнала, который мне нужен, чтобы найти

2019/03/15 14:22:59 [error] 14064#0: <error I need to find>, client: XXX.XXX.XXX.XXX, server: example.com, request: "POST /hello", host: "example.com"

Вы пробовали регулярное выражение?

D Malan 06.06.2019 17:10

@DelenaMalan Нет, нет, я склонен действительно сосать это. Я уверен, что смогу получить его, хотя мне нужно будет создать формат даты/времени и иметь возможность сравнивать. Версия new Date() для Python имеет тот же формат, что и журналы nginx?

user9753902 06.06.2019 17:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
3 046
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать шаблон регулярного выражения, чтобы найти различные части журналов, которые вас интересуют. Вы можете изолировать различные части, используя круглые скобки, ( и ), в «группы». Например, если вас интересует дата и сообщение об ошибке строки в файле журнала, вы можете использовать модуль Python re следующим образом:

import re
pattern = `^(\d+/\d+/\d+ \d+:\d+:\d+)\s+\S+\s+\S+\s+(.+), client`
match = re.search(line, pattern) # where line is a single line in the log
date_time = match.group(0)
error_message = match.group(1)

Вы можете увидеть, для чего предназначена каждая часть шаблона, который я использовал, и поэкспериментировать с ней здесь.

Поскольку вас интересуют только журналы за последние 15 минут, вы можете использовать другое регулярное выражение или модуль Python datetime для анализа даты и сравнения ее с текущим временем. Вы также можете сделать комбинацию из двух и написать менее сложный шаблон, который исключит явно старые журналы перед преобразованием даты в объект datetime.

Чтобы создать объект datetime из строки даты, которую вы получили выше, вы можете использовать метод datetime.strptime. Он анализирует строку в объект datetime заданного формата. Вы можете указать формат, используя директивы, перечисленные здесь. Вы можете написать такой метод, чтобы проверить, находится ли строка даты за последние 15 минут:

from datetime import datetime, timedelta

MAX_DIFF = timedelta(minutes=15)
DATE_FORMAT = "%Y/%m/%d %H:%M:%S"  

def is_recent_date(date_string):
    current_time = datetime.now() 
    date_object = datetime.strptime(date_string, DATE_FORMAT)
    diff = current_time - date_object
    return diff < MAX_DIFF

Вау спасибо! Кажется, это именно то, что мне нужно. Я начал делать регулярное выражение (как было предложено кем-то другим), но ваше намного лучше.

user9753902 06.06.2019 21:01

@JoshKirby рад, что смог помочь :)

D Malan 06.06.2019 21:08

Другие вопросы по теме