grok过滤器如何在logstash中工作

时间:2016-07-12 09:25:48

标签: logstash logstash-grok logstash-file

我正在编写Logstash配置文件。

我有一个grok过滤器。 我想知道grok过滤器中的匹配是如何工作的。

我在logstash方面提到了一个例子,并看到了以下内容:

Ex log:55.3.244.1 GET /index.html 15824 0.043
它使用下面的过滤器进行解析:

filter {
  grok {
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }

这意味着我们正在尝试按顺序匹配整个日志行? 我的日志行不同。它们并不总是处于适当的框架中 它像下面那样:

 1. 11:10:15---somedata
 2. 11:10:20---source--destination-- somedata
 3. somedata

我想要捕获所有三种类型的行 那么我应该写不同的匹配过滤器吗?或者在sigle匹配中单独捕获源,目标,某些数据字段是否正常?

寻求有关此事的信息。

是的,我确实理解正则表达式和grok模式的基础知识。但是我仍然对如何为以下内容编写匹配块感到困惑。

line 1: timestamp source destination a=0,b=1,c=3,d=4
line 2: timestamp a=1,e=5, b=1
line 3: g=0

假设我的日志文件中有这3行,我想要捕获具有b和g值的行。我的匹配块会是什么样的?

match => message ["b=":variable_b,"g=":variable_g]

这会用b和g捕获所有行吗?对于b,它应该捕获1和2行。因为它必须捕获3.所以我的输出应该有所有三行?这是它的工作原理还是会抛出一个grokparse错误?

1 个答案:

答案 0 :(得分:1)

grok过滤器使用匹配块中的模式。它作为正则表达式(参见here的定义)。每个模式由两部分组成:%{SYNTAX:SEMANTIC} 如果从模式创建的正则表达式与整行匹配,则SYNTAX中的值将添加为名称为SEMANTIC的字段。
请参阅documentation以获取更多信息。

您的过滤器中可以有多个grok模式:

grok {
    match => {
        "message" => [
            "%{TIME}--%{DATA:source}--%{DATA:destination}--%{DATA:somedata}",
            "%{TIME:timestamp}--%{GREEDYDATA:somedata}",
            "%{GREEDYDATA:somedata}"
        ]
    }
}

此外,根据Chro的评论:默认情况下,Grok过滤器将尝试按照提供的顺序匹配模式。所以,如果你把第三个(GREEDYDATA一个)放在第一个,它将简单匹配,然后离开过滤器。您可以使用break_on_match设置使其与多个模式匹配,方法是将其设置为false(默认情况下为true)。

随着你的更新:

在你的情况下,如果你有这些行:

timestamp source destination a=0,b=1,c=3,d=4
timestamp a=1,e=5, b=1
g=0

并且您希望提取bg值,而不是其他任何内容,您必须使用多个模式,一个用于获取b值,另一个用于`g值:

match => message [
    "b=%{NUMBER:b}",
    "g=%{NUMBER:g}"
]

Logstash逐行处理日志,输出将是该行完成的过程的结果。 grok过滤器尝试使用模式解析行,并在解析成功时添加字段。它不捕捉线条。