如何按时间跟踪日志文件?

如何按时间跟踪日志文件?

假设我的日志文件(log.txt)类似于

2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

我想跟踪这个文件以显示最后一小时的日志,并继续跟踪..

IE

tail <some magic to specify last 1 hour> -f log.txt

那么输出是

2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

有没有工具可以做到这一点?

答案1

您可以在 oneliner 中使用 grep 和 tail 的组合。

grep "2014-01-01 21:" log.txt; tail -f log.txt

它将打印从该小时开始的所有内容,并保持尾随。

或者您也可以使用 awk 打印从某个小时开始到文件结束的所有内容,并在其后继续跟踪,这将允许您在需要时跟踪最后几个小时。

awk '/2014-01-01 21:/' log.txt; tail -f log.txt

答案2

onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S") 
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"

没有 sed 命令的中间输出:

Aug  7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

输出:

Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

注意:首先我用 +"%b %e %H:%M:%S" 构建了日期(注意 %b 和 %e 之间的空白,但 echo 将两个空白压缩为一个。通过 sed 搜索似乎寻找两个空格并且找不到表达式,因此区分月份中的某一天是否有两位数或一位数是很复杂的,但是,排序似乎对多余/缺失的空格不可知,也许有一个 bash-switch 来防止压缩。 ?但是 - 你的日期格式不同,所以你不会受到影响,但我必须以某种方式测试这种方法,学习者可能会陷入同样的​​陷阱。

因此,总体想法是,要获取 1 小时前的日期/时间,请将其格式化为日志文件中的格式,将纯日期添加到日志文件中并对混合物进行排序,然后使用 sed 删除纯日期之前的任何内容。

记住和输入并不有趣,但您可以将其放入脚本和/或函数中。

答案3

tail -f您可以使用和的组合perl

# Tail with timestamp
tail -f log.txt | perl -pe '$_ = localtime.": $_"'

这将在终端上提供如下输出:

时间戳尾随#1 带时间戳的尾随#2

您还可以将此标准输出保存在文件中,如下所示:

tail -f log.txt | perl -pe '$_ = localtime.": $_"' >> timestamped_log.txt

希望这提供了一个解决方案

答案4

  • grepor 的问题awk是,您总是需要读取整个文件并检查每一行。
  • 问题tail是,你不知道需要多少行。

所以,尝试tac然后awktail -f.-n0

tac file \
  | awk -F'[- :]' -v datefilter="$(date -d -1hour +%s)" 'mktime($1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6) < datefilter {exit} 1' \
  | tac
tail -f -n0

(必须说的是,如果两个命令之间有新行,您可能会丢失它们)。

相关内容