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

时间:2018-01-23 17:40:09

标签: awk

这是我的日志格式:

from stop_words import get_stop_words

我使用它来获取最后x分钟日志:

127.0.0.1 user-identifier test [23/Jan/2018:16:45:22 -0700] [WARN ] message
127.0.0.1 user-identifier test [23/Jan/2018:16:55:23 -0700] [WARN ] message
127.0.0.1 user-identifier test [23/Jan/2018:17:00:24 -0700] [WARN ] message

但是,它似乎不起作用,因为我的日志不是以日期开头的。我的日志格式应该如何?感谢

2 个答案:

答案 0 :(得分:2)

最简单的解决方案我可以看到这将解析您的日志,实时,添加一个新的日期字段,它与简单的算术比较更兼容。例如,始终保持以下运行:

tail -0F /path/to/logfile | while read line; do
  [[ $line =~ ^([^[]+\[)([^]]+)(.*) ]]
  printf '%s %s%s%s\n' \
    $(date -j -f '%d/%b/%Y:%T %z' "${BASH_REMATCH[2]}" '+%s') \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
done >> /path/to/epochlogfile

请注意,我正在使用BSD date,因此我可以使用-f控制输入日期格式。您似乎正在使用GNU coreutils的日期命令,因此您需要弄清楚如何调整选项以适应。也许是这样的事情:

tail -0F /path/to/logfile | while read line; do
  [[ $line =~ ^([^[]+\[)([^]]+)(.*) ]]
  printf '%s %s%s%s\n' \
    $(d="${BASH_REMATCH[2]}"; d="${d/:/ }"; d="${d//\// }"; date -d "$d" '+%s') \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
done >> /path/to/epochlog

如果awkGNU awk,您可以选择假设tail -F将始终在时间戳引用的同时输出日志条目。在这种情况下,您不需要解析日期,您可以通过以下方式简化:

tail -0F /path/to/logfile | gawk '{print systime(),$0}' >> /path/to/epochlog

systime()函数是一个gawk扩展,它返回当前的纪元秒。重申一下,这些时间将反映日志条目到达tail命令时的,而不是应用程序记录的时间

当然,比让它保持运行更好的方法是首先使用可搜索的日期创建日志。您还没有说明创建此日志的内容,因此我无法在该区域提出任何具体建议。

获得替换日志文件后,您可以使用以下内容进行搜索:

#!/usr/bin/env bash

case $(uname -s) in
  Linux)        date_opts=( --date="-60 min" ) ;;
  *BSD|Darwin)  date_opts=( -v-60M ) ;;
  *) echo "No."; exit 1 ;;
esac

start=$(date "${date_opts[@]}" '+%s')

awk -v start="$start" '$1 > start' /path/to/epochlogfile

我跳过你的d2日期条件,因为现在就是这样。并且没有理由这个搜索脚本需要bash,它可能足够容易POSIX。我只是懒惰。到目前为止,您可能已经理解了这一点,如果它对您很重要,可以再次添加它。

免责声明:未经测试。因人而异。可能含有坚果。

答案 1 :(得分:2)

如果您在生成日志的whatevers中运行与TZ相同的脚本,那么您只需要:

$ cat tst.awk
BEGIN { FS="[[ /:]+" }
{
    mthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",$5)+2)/3
    time  = sprintf("%04d%02d%02d%02d%02d%02d", $6, mthNr, $4, $7, $8, $9)
}
time > tgt

适用于任何awk,您可以执行:

awk -v tgt="$(date --date='-60 min' +'%Y%m%d%H%M%S')" -f tst.awk

使用您已经使用的date版本支持这些参数。