为了将指标发布到 AWS CloudWatch,我想获取应用程序日志中最近一分钟内(从当前系统时间开始)某些关键字(例如,错误、异常)出现次数的信息。
以下是我迄今为止根据相关线程 (Filter log file entries based on date range) 的回答尝试过的命令:
awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '($1 FS $2) > Date {print $3}' application.log | grep "ERROR" | uniq -c
awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '{if ($1 > Date) {print $3}}' application.log | grep "ERROR" | uniq -c
awk -vDate=`date -d'now-1 minutes' +["%Y-%m-%d %H:%M:%S"` '{if ($1 == $Date) {print $3}}' application.log | grep "ERROR" | uniq -c
但是当我尝试这个时我得到这样的错误:
awk: cmd. line:1: 13:06:17
awk: cmd. line:1: ^ syntax error
以下是我的日志文件的格式:
2016-02-05 12:10:48,761 [INFO] from org.xxx
2016-02-05 12:10:48,761 [INFO] from org.xxx
2016-02-05 12:10:48,763 [INFO] from org.xxx
2016-02-05 12:10:48,763 [INFO] from org.xxx
2016-02-05 12:10:48,763 [ERROR] from org.xxx
2016-02-05 12:10:48,763 [INFO] from org.xxx
2016-02-05 12:10:48,764 [INFO] ffrom org.xxx
2016-02-05 12:10:48,773 [WARN] from org.xxx
2016-02-05 12:10:48,777 [INFO] from org.xxx
2016-02-05 12:10:48,778 [INFO] from org.xxx
纠结了好久。 感谢您的帮助!
最佳答案
您使用的是已弃用的反引号,因此未引用 date
输出。改为这样做:
awk -vDate="$(date -d'now-1 minutes' +"%Y-%m-%d %H:%M:%S")" '($1 FS $2) > Date { if ($3~/ERROR/) print $3}' file
请注意,您不需要通过管道传输到 grep
并且由于在 -v
和 Date
之间没有空格,您的脚本是 gawk -特定的,如果它是特定于 gawk 的,那么你不需要对 date
的外部调用,因为 gawk 有它自己的内置时间函数(提示:BEGIN{Date=strftime("%Y- %m-%d %H:%M:%S",systime()-60)}
).
你也不需要 uniq -c
但没有看到你的真实输入和预期输出(做一个 uniq -c
假设输入没有任何意义vs wc -l
) 我不会再猜了。
哦,见鬼,这是 gawk 中的整个脚本:
$ cat tst.awk
BEGIN {
#date = strftime("%Y-%m-%d %H:%M:%S",systime()-60)
date = "2016-02-05 12:10:48"
}
($1" "$2) > date {
if ($3 ~ /ERROR/) {
cnt[$3]++
}
}
END {
for (err in cnt) {
print err, cnt[err]
}
}
$
$ awk -f tst.awk file
[ERROR] 1
我假设在现实中您有各种类型的“ERROR”,这就是为什么您想要每种类型的计数。只需取消注释 strftime
行并删除硬编码时间戳行即可在您的真实数据上运行。
关于linux - 在最后一分钟内查找日志文件中关键字的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35225612/