zabbix_get и AWK / substr - ZBX_NOTSUPPORTED: слишком много параметров - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь использовать Zabbix для сбора информации о 500 ошибках в логах Apache. Я думал, что буду использовать zabbix_get для выполнения команды в операционной системе Агента, однако при попытке проверить это я получаю ошибку ZBX_NOTSUPPORTED: Too many parameters.. Сначала я пытался избежать всех " и других специальных символов, но безуспешно. При попытке отладить команду (которая хорошо работает локально, без использования zabbix_get) я обнаружил, что проблема, вероятно, где-то близко к AWK и substr. Буду признателен, если кто-нибудь может взглянуть ...

tail -n 1000 /content/logs/httpd/*_access.log | awk -v d1="$(date --date='-5 min' '+%_d/%b/%Y:%H:%M:%S')" -v d2="$(date '+%_d/%b/%Y:%H:%M:%S')" 'substr($5,2) > d1 && substr($5,2) < d2 || substr($5,2) ~ d2' | cut -d" " -f10 | grep "500" | wc -l

Пример ввода:
IP IP - - [21/Jan/2019:03:14:06 -0500] "GET /path HTTP/1.1" 200 2068 referrer "UserAgent" 7634. IP IP - - [21/Jan/2019:03:14:06 -0500] "GET /path HTTP/1.1" 500 1 "-" "UserAgent" 1892

Выход:
1

Я хотел бы выполнять указанную выше команду каждые 5 минут для подсчета количества записей с ошибкой 500, произошедшей в течение предыдущих 5 минут.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2019

При условии, что ваше сравнение даты является правильным (на самом деле это не так из-за буквы месяца) попробуйте это:

  tail -n 1000 /content/logs/httpd/*_access.log | awk -v d1="$(date --date='-5 min' '+%_d/%b/%Y:%H:%M:%S')" -v d2="$(date '+%_d/%b/%Y:%H:%M:%S')" '{Ti=substr($5,2)};( Ti > d1 && Ti <= d2 ) && $10 ~ /5[0-9][0-9]/  {Cnt++;print $10} END{print Cnt+0}'

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

awk -v d1="$(date --date='-5 min' '+%_d/%b/%Y:%H:%M:%S')" -v d2="$(date '+%_d/%b/%Y:%H:%M:%S')" '($5 < "[" d1){next};{Ti=substr($5,2)};( Ti > d1 && Ti <= d2 ) && $10 ~ /5[0-9][0-9]/  {Cnt++;print $10} END{print Cnt+0}' /content/logs/httpd/*_access.log 

Вы также можете ограничить * _access.log с помощью $( find /content/logs/httpd -name *_access.log -mmin -6)

0 голосов
/ 23 января 2019

Вместо использования zabbix_get вы можете создать system.run[blablabla].

Однако вы должны использовать встроенную функцию мониторинга файлов журнала : используйте logrt.count или log.countфункции для извлечения количества совпадающих строк.

...