使用 Grok 跳过部分消息或日志

ani*_*aje 6 logstash logstash-grok

我刚刚开始将 grok 用于 logstash,我正在尝试使用 grok 过滤器解析我的日志文件。我的日志如下所示

03-30-2017 13:26:13 [00089] TIMER XXX.TimerLog:entType [组织],queueType [输出],memRecno = 446323718,audRecno = 2595542711,经过时间 = 998ms

我只想捕获初始日期/时间戳entType [organization]、 和elapsed time = 998ms

但是,看起来我必须为该行中的每个单词和数字匹配模式。有没有办法可以跳过它?我试图四处寻找,但找不到任何东西。请帮忙。

小智 7

根据查尔斯·达菲的评论。

有两种方法可以做到这一点:GREEDYDATA方式(?:.*)

grok {
  match => {"message" => "^%{DATE_US:dte}\s*%{TIME:tme}\s*\[%{GREEDYDATA}elapsed time\s*=\s*%{BASE10NUM}"
}
Run Code Online (Sandbox Code Playgroud)

或者,告诉它忽略匹配项并查找列表中的下一个匹配项。

grok {
  break_on_match => false
  match => { "message" => "^%{DATE_US:dte}\s*%{TIME:tme}\s*\[" }
  match => { "message" => "elapsed time\s*=\s*%{BASE10NUM:elapsedTime}"
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将日期和时间重新加入单个字段并将其转换为时间戳。


Suf*_*ori 6

正如Charles Duffy所建议的,您可以简单地绕过不需要的数据。

你可以用.*它来做到这一点。

以下将产生您想要的输出,

%{DATE_US:dateTime}.*entType\s*\[%{WORD:org}\].*elapsed time\s*=\s*%{BASE10NUM}
Run Code Online (Sandbox Code Playgroud)

解释:

  • \s*匹配空格字符。
  • \[正在绕过[字符。
  • %{WORD:org}定义单词边界并将其放置在新字段中org

输出

{
  "dateTime": [
    [
      "03-30-2017"
    ]
  ],
  "MONTHNUM": [
    [
      "03"
    ]
  ],
  "MONTHDAY": [
    [
      "30"
    ]
  ],
  "YEAR": [
    [
      "2017"
    ]
  ],
  "org": [
    [
      "organization"
    ]
  ],
  "BASE10NUM": [
    [
      "998"
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

单击查看所有可用 grok 模式的列表