繁体   English   中英

grok过滤器如何在Logstash中工作

[英]How does the grok filter work in logstash

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

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

我在logstash端提到了一个示例,并看到了以下内容:

55.3.244.1 GET /index.html 15824 0.043记录: 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模式的基础知识。但是我仍然对如何编写以下内容的match块感到困惑。

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过滤器与match块中的模式一起使用。 它用作正则表达式(有关定义,请参见此处 )。 每个模式都由两部分组成: %{SYNTAX:SEMANTIC}
如果从模式创建的正则表达式与整行匹配,则来自SYNTAX的值将添加为名称为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

并且您希望提取bg值,而别无其他,则必须使用多个模式,一个用于获取b值,另一种用于`g值:

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

Logstash逐行处理日志,输出将是该行完成处理的结果。 grok过滤器尝试解析带有模式的行,并在解析成功的情况下添加字段。 它不捕获线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM