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






Вы можете использовать шаблон регулярного выражения, чтобы найти различные части журналов, которые вас интересуют. Вы можете изолировать различные части, используя круглые скобки, ( и ), в «группы». Например, если вас интересует дата и сообщение об ошибке строки в файле журнала, вы можете использовать модуль 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
Вау спасибо! Кажется, это именно то, что мне нужно. Я начал делать регулярное выражение (как было предложено кем-то другим), но ваше намного лучше.
@JoshKirby рад, что смог помочь :)
Вы пробовали регулярное выражение?