【发布时间】:2012-07-13 11:51:53
【问题描述】:
我正在尝试设置一个脚本,当某个字符串出现在日志文件中时会生成警报。
已经存在的解决方案每分钟对整个日志文件进行一次 greps,并计算字符串出现的频率,使用日志行的时间戳来仅计算前一分钟的出现次数。
我认为用尾巴做这个会更有效率,所以我尝试了以下方法作为测试:
FILENAME="/var/log/file.log"
tail -f $FILENAME | awk -F , -v var="$HOSTNAME" '
BEGIN {
failed_count=0;
}
/account failure reason/ {
failed_count++;
}
END {
printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count);
}
'
但这只是挂起并且不输出任何内容。有人建议做这个小改动:
FILENAME="/var/log/file.log"
awk -F , -v var="$HOSTNAME" '
BEGIN {
failed_count=0;
}
/account failure reason/ {
failed_count++;
}
END {
printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count);
}
' <(tail -f $FILENAME)
但它做同样的事情。
我正在使用的 awk(我已在上面的代码中进行了简化)工作正常,因为它在现有脚本中使用,grep "^$TIMESTAMP" 的结果通过管道传输到其中。
我的问题是,如何让 tail -f 与 awk 一起工作?
【问题讨论】:
-
当您
tail -f时,您的 awk 脚本永远不会结束。所以你一直在计算错误,但从不打印任何东西。您需要运行 printf 并重置计数器的另一个条件(例如,检测到新的一天)。向我们展示您的日志样本,我们可以提出修复建议。