如何获取最后N分钟的日志消息

时间:2018-01-22 22:32:35

标签: bash logging awk

我的日志采用以下格式:

[2018-01-22T13:40:22,825][WARN ] message
[2018-01-22T13:41:52,830][ERROR ] message
[2018-01-22T13:45:27,831][WARN ] message

我需要编写一个脚本来检查过去5分钟内是否有任何错误。从我在网上发现的,这样的事情应该有效:

awk -v d1="$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S")" -v d2="$(date "+%Y-%m-%dT%H:%M:%S")" '$0 > d1 && $0 < d2 || $0 ~ d2' log.txt

但事实并非如此。我认为[可能正在阻碍?我还能尝试什么?

2 个答案:

答案 0 :(得分:2)

Awk 解决方案:

示例log.txt

[2018-01-22T13:40:22,825][WARN ] message
[2018-01-23T00:38:37,830][ERROR ] message
[2018-01-22T13:45:27,831][WARN ] message
awk -v d1="$(date --date="-5 min" "+%Y-%m-%dT%H:%M:%S")" \
    -v d2="$(date "+%Y-%m-%dT%H:%M:%S")" \
    '$2 > d1 && $2 < d2 && $4~/ERROR/' FS='[\\[\\]]' log.txt
  • FS='[\\[\\]]' - 将方括号视为复杂字段分隔符

输出:

[2018-01-23T00:38:37,830][ERROR ] message

答案 1 :(得分:2)

你是对的,[正在阻碍你。

词典比较,$0 > d1,比较如下:

[2018-01-22T13:45:27,831][WARN ] message

2018-01-22T13:45:27

[...始终大于以数字开头的任何字符串,例如20..

同样适用于$0 < d2 - 但在这种情况下,条件从不满足[20..始终大于20.. )。这就是为什么你没有得到任何输出。

快速解决问题的方法是简单地格式化d1d2[开头:

awk -v d1="$(date --date="-5 min" "+[%Y-%m-%dT%H:%M:%S")" -v d2="$(date "+[%Y-%m-%dT%H:%M:%S")" '$0 > d1 && $0 < d2' log