#python #log4j
#python #log4j
Вопрос:
Я пытаюсь проанализировать журналы моего java-приложения (используя log4j), зарегистрированные за последние пять минут. Я планирую использовать Python для анализа журналов за последние пять минут, и если будут какие-либо предупреждения, отправьте мне электронное письмо.
Может ли кто-нибудь подсказать мне, каков наилучший метод получения строк журнала за последние пять минут?
Для этого я должен использовать python.
формат журнала следующий,
2011-11-14 10:15:46 WARN : sample warning
2011-11-14 10:15:47 WARN : sample warning
2011-11-14 10:15:48 WARN : sample warning
2011-11-14 10:15:49 WARN : sample warning
Ответ №1:
Поскольку ваш файл журнала отсортирован в хронологическом порядке, вам придется проанализировать его полностью:
from datetime import datetime, timedelta
now = datetime.now()
lookback = timedelta(minutes=5)
oldest = (now - lookback).strftime('%Y-%m-%d %H:%M:%S')
lines = []
with open('logfile.log', 'r') as f:
for line in f:
if line[:19] > oldest:
lines.append(line)
if lines:
message = 'n'.join(lines)
# send message per mail...
Комментарии:
1. Большое спасибо. Это помогло мне и решило мою проблему. Как вы думаете, хорошей идеей будет чтение с конца файла, чтобы сделать этот процесс эффективным?
2. Вы можете поиграть с
f.seek(...)
и найти подходящую позицию байта в файле, с которой вы хотите начать поиск. Зависит от размера файла и частоты обновления.
Ответ №2:
Анализ «последних 5 минут» на самом деле не имеет большого смысла. На моем месте я бы постоянно запускал что-то и ограничивал выдачу оповещений каждые 5 минут.
(предполагая, что вы хотите использовать log4j для записи в файл …) Хотя вы могли бы обрабатывать файловый ввод-вывод в своем коде на python, вероятно, проще использовать ‘tail’ для передачи файла в ваш скрипт. Очевидно, вам нужно будет спланировать, как вы справляетесь с вращающимися файлами журнала — предположительно, у вас уже есть какой-то механизм для этого — ему нужно указать, чтобы код python повторно открывал свои дескрипторы файлов после вращения.
Возможно, было бы намного проще отправить данные в ваш скрипт на python с помощью канала — и позволить python обрабатывать вращение.
В любом случае, не забудьте добавить SIGALRM для принудительной проверки события при отсутствии каких-либо сообщений журнала.
Комментарии:
1. Изначально я также думал о постоянно работающей программе. Но у меня плохой опыт постоянного запуска сценариев оболочки в течение длительного времени. Потому что через некоторое время они будут зависать. При этом я планирую запускать программу раз в пять минут и помещать это в cron. Спасибо, что упомянули о SIGALARM. Поскольку я новичок в Python, я раньше не использовал SIGALARMS. Спасибо за ваши идеи.