繁体   English   中英

如果错误更改为特定 ID 的日志中的信息,如何在 Linux 中搜索

[英]How to Search in Linux if ERROR changes to INFO in logs for a particular ID

我有一个日志如下。 我只需要过滤掉 ERROR state 中重复出现 REQ ID 的 ERROR 行。

对于以下情况中的示例,预期 output 是 REQ3,因为它在第 3 行的错误 state 中,重试后再次出现错误。 (可以无限次重试,但我们可以检查它是否在一天中连续出现错误)对于 REQ2,它在第 2 行的错误 state 中,但在第 5 行中更改为 INFO,因此预计不会在 output 中出现。

....

yyyy-mm-dd [INFO] REQ1 Context 1
yyyy-mm-dd [ERROR] REQ2 Context 2
yyyy-mm-dd [ERROR] REQ3 Context 3
yyyy-mm-dd [INFO] REQ1 Context 4
yyyy-mm-dd [INFO] REQ2 Context 5
yyyy-mm-dd [ERROR] REQ3 Context 6

....

一种快速的解决方案可能是首先找到打印了非错误消息的所有请求 ID。 您可以使用以下方法来执行此操作:

假设你的日志在text.txt

  1. grep -v "\[ERROR\]" test.txt | cut -d ' ' -f 3 | tr '\n' '|' 这将导致您不想用|分隔的所有事件 ID .

您可以在完整日志文件的反向 grep 操作中使用此管道分隔的字符串列表,以仅保留您需要的内容。

┌─[dspataro@dspataroarchazzo]─(/tmp)
└─[15:17]--[$] grep  -v "\[ERROR\]" test.txt | cut -d ' ' -f 3 | tr '\n' '|'
REQ1|REQ1|REQ2|
┌─[dspataro@dspataroarchazzo]─(/tmp)
└─[15:17]--[$] R="REQ1|REQ1|REQ2"
┌─[dspataro@dspataroarchazzo]─(/tmp)
└─[15:17]--[$] cut -d ' ' -f 3 test.txt  | sort | uniq | grep -E -v "$R"
REQ3

这个awk命令应该可以完成这项工作:

awk '
    { if ($2=="[ERROR]") errors[$3]; else cleared[$3] }
    END { for (id in errors) if (!(id in cleared)) print id }
' file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM