我正在编写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错误?
答案 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
并且您希望提取b
和g
值,而不是其他任何内容,您必须使用多个模式,一个用于获取b
值,另一个用于`g值:
match => message [
"b=%{NUMBER:b}",
"g=%{NUMBER:g}"
]
Logstash逐行处理日志,输出将是该行完成的过程的结果。 grok过滤器尝试使用模式解析行,并在解析成功时添加字段。它不捕捉线条。