shell - 如何根据时间戳搜索日志文件
问题描述
我编写了一个简单的代码,它会在服务关闭时发送一封电子邮件,一旦我重新启动服务,脚本将检查文件中是否存在相同的关键字。问题是它可能会在日志中发现较早的错误并给出服务仍然关闭的错误警报。所以我决定根据时间戳进行搜索。
dt=$(date +"%D %T")
awk '$0 ~ "Connection refused" && $0 >= $dt' /***.log
这仍然返回所有旧结果
这就是日志内容的样子。
[08/06/20 11:36:54.577]:Work...
请让我知道我在这里缺少什么,以及这是否是解决此问题的最佳方法。编辑:这将是一个每小时运行一次的自动化脚本。
谢谢!
解决方案
您也得到旧结果的原因是您并没有真正与那个日期进行比较,而是$dt
在条件内部进行了一些未定义的比较awk
。awk
正文不是您按原样使用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
没有第一个字符。
推荐阅读
- jenkins - 以 XML 格式将 Jacoco 的覆盖率报告导出到 Jenkins
- python - 如何在 Python 中绘制平均 ROC 和 AUC?
- routing - 路由模式匹配未从多个路由调用
- ansible - ansible 创建本地目录(主)
- flutter - Flutter:带有表情符号的 TextField 无法正常工作
- android - 如何获取 JSON 数组的正确 URL
- css - 设置溢出后有边距:隐藏的div?
- python - djangorestframework 视图的查询参数的 DRY 验证
- c# - 如何在 EF Core 中拥有外键和其他属性的复合键?
- javascript - 如何在 react-numpad 小部件中使用 handleChange?