Поиск даты и времени в журнале относительно системного времени – в пределах 10 минут – Подтверждение работы журнала

Вопрос или проблема

Я пытаюсь найти способ мониторинга одного из наших лог-файлов.

Крон-работа запускается каждые 5 минут и выводит следующую строку в лог-файл:

02-16-17 18:40:01 

Я хотел бы что-то подобное

cat log | grep $DATE $TIME в пределах 10 минут от $SYSTEMTIME

Этот лог в настоящее время занимает 2 МБ, так что я не уверен, не расходует ли это слишком много ресурсов, хотя серверу не хватает множество дополнительных ресурсов, но использование cat для текстового файла размером 2 МБ кажется, что это много данных для анализа каждые 15 минут.

Предложения? Я нашел много примеров поиска по конкретной дате/времени, но мне нужно, чтобы дата/время были относительными к моменту выполнения поиска.

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

На Perl:

perl -MPOSIX -ne '
  BEGIN {
    # время отсечения в формате yy-mm-dd HH:MM:SS
    $cutoff = strftime("%y-%m-%d %T", localtime(time - 10 * 60))
  }
  print if /^(\d\d-\d\d)-(\d\d) (\d\d:\d\d:\d\d)/ && "$2-$1 $3" ge $cutoff
  ' < file.log

.

Ответ или решение

Для мониторинга лог-файлов и поиска записей, относящихся к времени, находящемуся в пределах 10 минут от текущего системного времени, вы можете использовать различные подходы. В данном случае, учитывая размер лог-файла, существует эффективный способ, основанный на использовании Perl, который минимизирует нагрузку на ресурсы системы.

Решение с использованием Perl

  1. Переформатирование данных: Для упрощения версии, когда вы хотите сравнить временные метки, вы можете изменить порядок вывода дат и времени. Переход к формату гггг-мм-дд ЧЧ:ММ:СС делает их сравнение более простым и эффективным.

  2. Скрипт на Perl: Вот пример, который поможет вам найти записи времени из вашего лог-файла, которые были созданы в течение последних 10 минут относительно текущего системного времени:

perl -MPOSIX -ne '
  BEGIN {
    # Время отсечения в формате гггг-мм-дд ЧЧ:ММ:СС
    $cutoff = strftime("%y-%m-%d %T", localtime(time - 10 * 60));
  }
  print if /^(\d\d-\d\d)-(\d\d) (\d\d:\d\d:\d\d)/ && "$2-$1 $3" ge $cutoff
' < file.log

Объяснение кода:

  • BEGIN: Этот блок выполняется перед основным выполнением. Мы определяем переменную $cutoff, которая хранит метку времени, на 10 минут меньше текущего времени.
  • print if: Эта часть проверяет, соответствует ли каждая строка формату даты и времени. Если да, то она сравнивает с $cutoff, печатая строки, которые удовлетворяют условию.

Преимущества данного метода:

  • Эффективность: Вы обрабатываете только строки, которые соответствуют формату, и избегаете загрузки всего файла в память.
  • Нагрузка на систему: С этим скриптом вы минимизируете ресурсы, так как Perl достаточно эффективен при работе с текстом, и 2MB — это относительно небольшой объем данных для обработки.

Альтернативные методы:

Если вам нужно более интерактивное решение, можно рассмотреть использование инструментов вроде awk или grep, но они могут потребовать более сложных манипуляций с датами.

Оптимизация:

Чтобы не обрабатывать весь файл каждый раз, вы можете настроить cron, чтобы он выполнял этот скрипт через определенные промежутки времени, например, каждые 15 минут. Это позволит вам проверять только последние записи, и вы будете уверены, что система не перегружена.

Заключение

Используя предложенный скрипт на Perl, вы сможете эффективно отслеживать записи в логе, сохраняя при этом производительность системы. Этот метод проста в реализации и доступен для модификаций в зависимости от ваших потребностей.

Оцените материал
Добавить комментарий

Капча загружается...