首页 > 解决方案 > 如何根据时间戳搜索日志文件

问题描述

我编写了一个简单的代码,它会在服务关闭时发送一封电子邮件,一旦我重新启动服务,脚本将检查文件中是否存在相同的关键字。问题是它可能会在日志中发现较早的错误并给出服务仍然关闭的错误警报。所以我决定根据时间戳进行搜索。

dt=$(date +"%D %T")
awk '$0 ~ "Connection refused" && $0 >= $dt' /***.log

这仍然返回所有旧结果

这就是日志内容的样子。

[08/06/20 11:36:54.577]:Work...

请让我知道我在这里缺少什么,以及这是否是解决此问题的最佳方法。编辑:这将是一个每小时运行一次的自动化脚本。

谢谢!

标签: shellawk

解决方案


您也得到旧结果的原因是您并没有真正与那个日期进行比较,而是$dt在条件内部进行了一些未定义的比较awkawk正文不是您按原样使用bash变量的地方。看看你是怎么做到的:https ://www.gnu.org/software/gawk/manual/html_node/Using-Shell-Variables.html

dt=$(date +"%D %T")
awk -v dt="$dt" '$0 >= dt && $0 ~ /Connection refused/' file

按字母顺序比较似乎足以满足您的情况,我假设您查看几个小时或几天的日志(我认为它可能只会在元旦前后失败,或者不会,这可能取决于日志文件轮换和您的环境)。

为了使其更快,因为您的日志行仍按日期排序,您希望从重新启动时间戳搜索到文件末尾,因此您可以在找到该时间戳时设置一个标志并仅在此之后检查模式:

awk -v dt="$dt" 'f && $0 ~ /Connection refused/{print; next} $0 >= dt {f=1}' file

您会看到在临界点之后不再检查任何时间戳。在任何情况下,最好准确匹配上次服务重启(如何做到这一点取决于详细信息,您没有提供任何信息)而不是比较。


编辑:在问题的示例行中,我们有括号内的时间戳

[08/06/20 11:36:54.577]:Work...

这可以通过例如这个修改

awk -v dt="$dt" 'f && $0 ~ /Connection refused/{print; next} substr($0,2) >= dt {f=1}' file

wheresubstr($0,2)返回$0没有第一个字符。


推荐阅读