尝试使用logstash grok过滤器(oniguruma regex)过滤一些日志。对于如下所示的日志条目:
2019-03-24 17:57:14,202 p=19455 u=root | TASK [this is the task name msg=Debug message] ************************
我写了这个过滤器:
%{DATE:date}\s%{TIME:time}\sp=(?<id>[\d]+)\su=(?<user>[\w]+)\s\|\s*TASK\s*\[(?<task>[^=]*)
这对我来说很困难,就是我需要将“任务”标签准确地匹配到这个: “这是任务名称”。此时,“任务”与“”这是任务名称msg”匹配。 当然,这只是一个示例,单词本身在示例之间会发生变化。
这是一个Ansible日志,由于某种原因,它会将任务名称和任务本身混合在同一日志行中,并且仅使用空格将它们分开。在所有情况下,由于“ =”符号,我知道任务名称已经完成并且任务详细信息正在显示。
因此,我需要进行匹配,直到找到“ =”,然后将其后面的单词取反,在这种情况下,该单词是“ msg”(根据任务的不同,该单词也可能会更改)。
任何想法如何做到这一点?谢谢!
答案 0 :(得分:1)
您可以使用
%{DATE:date}\s%{TIME:time}\su=(?<user>\w+)\s\|\s*TASK\s*\[(?<task>[^\]=]*)\s\w+=
请参见regex demo
有趣的是(?<task>[^\]=]*)\s\w+=
部分:
(?<task>[^\]=]*)
-名为“任务”的组:[^\]=]*
与]
和=
\s
-一个空格\w+
-1个以上的字符字符=
-一个=
字符