从符号取反直到前一个 space

Negating from symbol until the previous space

正在尝试使用 logstash grok 过滤器(oniguruma 正则表达式)来过滤一些日志。对于如下所示的日志条目:

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"。此时"task"匹配“"this is the task name msg"。 当然,这只是一个示例,每个示例中的词语本身都会有所不同。

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

所以我需要匹配直到找到一个“=”,然后取反它后面的词,在本例中是"msg"(根据任务,这个词也可以改变)。

有什么想法可以实现吗?谢谢!

您可以使用

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

regex demo

(?<task>[^\]=]*)\s\w+= 部分感兴趣:

  • (?<task>[^\]=]*) - 名为 "task" 的组:[^\]=]* 匹配除 ]=
  • 以外的任何 0+ 个字符
  • \s - 一个空格
  • \w+ - 1+ 个单词字符
  • = - 一个 = 字符