【问题标题】:How do I search a log file based on timestamp如何根据时间戳搜索日志文件
【发布时间】:2020-08-07 00:37:28
【问题描述】:

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

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

这仍然会返回所有旧结果

这就是日志内容的样子。

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

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

谢谢!

【问题讨论】:

  • 步骤 1. 将时间戳转换为自纪元以来的秒数。 2. 比较为数字。
  • 您需要检查包含“拒绝连接”的最后一行和所需的时间戳。可能是,您可以保存上次失败的时间戳,然后在重新启动服务后将其与包含错误的文件的最后一行进行比较。对于最后一行,您可以在 AWK 的 END{} 部分打印它。
  • mchelabi,这将是一个自动化脚本,所以我不会保存最后一次失败并进行比较。
  • 当前时间总是大于错误时间,你永远无法在文件中找到它。此外,您的 AWK 命令不正确,代码中的 $td 不包含变量的值。
  • 当您远离解决方案时,它有助于将读者的注意力集中在在 shellcheck.net 检查时不会产生任何警告的代码上。这个 Q 每月至少被问 1 次,您是否尝试在这里搜索答案?祝你好运。

标签: shell awk


【解决方案1】:

您也得到旧结果的原因是您并没有真正与那个日期进行比较,而是在awk 条件内有一些未定义的$dtawk 正文不是您按原样使用 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

其中substr($0,2) 返回不带第一个字符的$0

【讨论】:

  • $0 包含一个字符串,不能将日期 'dt' 与算术运算符 '>=' 进行比较。此外,提供的行不完整,它可能包含其他可能返回错误结果的字符串。
  • @mchelabi dt 也是一个字符串(bash 命令的输出),这是按字母顺序比较的字符串。
  • 您只需要越过每行开头的[ 即可得到比较日期。
  • @thanasisp,是的,我知道,在这种情况下,只需要提取包含“时间戳”的字段然后进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多