zabbix_get 和 AWK/substr语言 - ZBX_NOTSUPPORTED:参数太多



我正在尝试使用Zabbix来收集有关Apache日志中500个错误的信息。我想,我将使用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 分钟内发生的错误条目数。

我知道我总是可以创建一个脚本,但如果我可以避免这样做......

谢谢!

您可以创建一个system.run[blablabla],而不是使用zabbix_get

但是,您应该使用本机日志文件监视功能:使用 logrt.countlog.count 函数提取匹配行数。

假设您的日期比较是正确的(实际上由于月份的字母,情况并非如此)试试这个:

  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 

您还可以使用$( find /content/logs/httpd -name *_access.log -mmin -6)限制 *_access.log

最新更新