我正在尝试使用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.count
或 log.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