Как искать в файле журнала по метке времени - PullRequest
1 голос
/ 06 августа 2020

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

dt=$(date +"%D %T")
awk '$0 ~ "Connection refused" && $0 >= $dt' /***.log

это все еще возвращает все старые результаты

Вот как выглядит содержимое журнала.

[08/06/20 11:36:54.577]:Work...

Пожалуйста, дайте мне знать, что мне здесь не хватает, и go ли это лучший способ узнать об этом. Изменить: это будет автоматический скрипт, который будет запускаться каждый час.

Спасибо!

1 Ответ

2 голосов
/ 06 августа 2020

Причина, по которой вы также получаете старые результаты, заключается в том, что вы действительно сравниваете не с этой датой, а с некоторым неопределенным $dt внутри условия awk. Тело awk не является тем местом, где вы используете переменную bash как есть. Посмотрите, как вы это делаете: https://www.gnu.org/software/gawk/manual/html_node/Using-Shell-Variables.html

dt=$(date +"%D %T")
awk -v dt="$dt" '$0 >= dt && $0 ~ /Connection refused/' file

Алфавитного сравнения кажется достаточно для вашего случая, я полагаю, вы просматриваете журналы за несколько часов или дней (я думаю, что это может выйти из строя только в новогодние праздники или нет, возможно, в зависимости от ротации файлов журнала и вашей среды).

Чтобы ускорить процесс, поскольку ваши строки журнала по-прежнему отсортированы по дате, вы хотите искать из перезапустите отметку времени до конца файла, чтобы вы могли установить флаг, когда найдете эту отметку времени, и проверить шаблон только после этого:

awk -v dt="$dt" 'f && $0 ~ /Connection refused/{print; next} $0 >= dt {f=1}' file

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


Изменить: в строке образца В вопросе у нас есть временная метка внутри скобок

[08/06/20 11:36:54.577]:Work...

, и это можно передать, например, с помощью этой модификации

awk -v dt="$dt" 'f && $0 ~ /Connection refused/{print; next} substr($0,2) >= dt {f=1}' file

, где substr($0,2) возвращает $0 без первого символа.

...