0

我正在编写一个 Logstash 配置文件。

我有一个 grok 过滤器。我想知道 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

我想捕获所有三种类型的行所以我应该编写不同的匹配过滤器吗?还是可以在一个匹配中分别捕获 source、destination、somedata 字段?

寻求这方面的信息。

是的,我确实了解正则表达式和 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 错误?

4

1 回答 1

1

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

您的过滤器中可以有多个 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

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

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

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

于 2016-07-12T12:10:15.213 回答