1

尝试使用 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>[^=]*)

对我来说,困难在于我需要将“任务”标签与以下内容完全匹配:“这是任务名称”。此时“task”匹配“this is the task name msg”。当然,这只是一个示例,单词本身会因示例而异。

这是一个 ansible 日志,它出于某种原因将任务名称和任务本身混合在同一日志行中,并且仅使用空格将它们分隔。在所有情况下,由于“=”符号,我知道任务名称已完成并且正在显示任务详细信息。

所以我需要匹配直到找到“=”,然后否定它后面的单词,在这种情况下是“msg”(取决于任务,这个词也可能改变)。

任何想法如何做到这一点?谢谢!

4

1 回答 1

1

您可以使用

%{DATE:date}\s%{TIME:time}\su=(?<user>\w+)\s\|\s*TASK\s*\[(?<task>[^\]=]*)\s\w+=

查看正则表达式演示

(?<task>[^\]=]*)\s\w+=部分是有趣的:

  • (?<task>[^\]=]*) - 名为“task”的组:[^\]=]*匹配除]and之外的任何 0+ 个字符=
  • \s- 一个空格
  • \w+- 1+字字符
  • =- 一个=字符
于 2019-03-24T18:31:03.450 回答