出于向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
坚持这一点很长一段时间。 谢谢你的帮助!
答案 0 :(得分:0)
您正在使用已弃用的反引号,因此不引用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
),所以你不需要对BEGIN{Date=strftime("%Y-%m-%d %H:%M:%S",systime()-60)}
进行外部调用。
您也不需要uniq -c
但却看不到您的实际输入和预期输出(执行uniq -c
,因为输入对wc -l
没有任何意义我不会再猜了。
哦,到底是什么,这是整个剧本中的傻瓜:
$ 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
行并删除硬编码时间戳行即可在您的实际数据上运行。