我正在编写一个 Logstash 配置文件。
我有一个格罗克过滤器。我想知道 grok 过滤器中的匹配是如何工作的。
我参考了logstash方面的一个例子,并看到了以下内容:
防爆日志: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 行。 对于 g,它必须捕获 3。所以我的输出应该有所有三行??这是它的工作原理还是会抛出 grokparse 错误?
grok 过滤器与匹配块中的模式一起工作。它用作正则表达式(有关定义,请参阅此处)。每个模式由两部分组成:%{SYNTAX:SEMANTIC}
。
如果从模式创建的正则表达式与整行匹配,则SYNTAX
中的值将添加为名称为 SEMANTIC
的字段。
有关详细信息,请参阅文档。
您可以在过滤器中有多个 grok 模式:
grok {
match => {
"message" => [
"%{TIME}--%{DATA:source}--%{DATA:destination}--%{DATA:somedata}",
"%{TIME:timestamp}--%{GREEDYDATA:somedata}",
"%{GREEDYDATA:somedata}"
]
}
}
另外,从 Chro 的评论中:默认情况下,Grok 过滤器将尝试按照提供的顺序匹配模式。因此,如果您将第三个(GREEDYDATA)放在第一位,它将简单地匹配然后离开过滤器。您可以通过将其设置为 false(默认情况下为 true)来使其与break_on_match设置匹配多个模式。
通过更新:
在您的情况下,如果您有这些行:
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 过滤器会尝试分析具有模式和添加字段的行。它不会捕获线条。