filter grok 判断_filter-grok,dissect匹配数据

本文介绍了Grok和Dissect在Logstash中解析非结构化日志的用法。Grok利用正则表达式匹配日志,适合结构不一的文本,而Dissect通过定界符切分,适用于结构稳定的数据。同时,文章提供了一个自定义Grok匹配小数点数字的示例,并展示了如何利用官方预定义模式简化配置。此外,还讨论了如何使用Dissect实现类似Grok的效果,以及两个过滤器的配置选项和应用场景。
摘要由CSDN通过智能技术生成

Grok(正则捕获)、Dissect(切分):

grok使用正则匹配来提取非结构化日志数并据解析为结构化和可查询的内容。

dissect使用多种定界符(非数字和字母的符号,split只能一次只能使用一种定界符)来提取非结构化日志数据。

dissect与grok的不同之处在于它不使用正则表达式并且速度更快。当数据可靠地重复时,解析很有效。当文本结构因行而异时,grok是更好的选择。当线路的一部分可靠重复时,您可以同时使用dissect和grok作为混合用例。dissect过滤可以解构重复行的部分。grok过滤可以处理剩余的字段值,具有更多的正则表达式可预测。

自定义格式:

(?the pattern here)

示例:

[root@node2006 logstash]# bin/logstash -e 'input{stdin{}}filter{grok{match => {"message" => "(?\d+\.\d+)" }}}output{stdout{codec=>rubydebug}}' #匹配带有小数点的数字,这里得到的字段值是字符串类型。logstash中只有三种类型,string,integer,float。如果不指定类型,默认string

123.456

...

{

"message" => "123.456",

"host" => "node2006",

"request_time" => "123.456",

"@version" => "1",

"@timestamp" => 2019-01-25T06:43:37.948Z

}

上面的示例是匹配一个字段。如果为了匹配一行web日志,将全部写在一行,而且一行过多时就显的乱了。

还好官方提供了大量的已经写好的正则规则,只需要调用即可。官方调试地址:http://grokdebug.herokuapp.com/

如果需要自己配置相应的正则规则时,建议把所有的grok表达式统一写入到patterns目录下某个有意义名称的文件里,并在grok中使用patterns_dir参数调用即可。这样就可管理了。

标准格式:

%{SYNTAX:SEMANTIC}

SYNTAX是与您的文本匹配的模式名称,正则表达式也在patterns目录下某个文件里的简称

SEMANTIC是您为匹配的文本提供的标识符,也就是获取跟据SYNTAX获取到的数据的key,获取到的数据就是value

```

[root@node2006 logstash]# head -n 3 ./vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns #logstash自带的正则表达式就都存放在此文件里,USERNAME就是SYNTAX,[a-zA-Z0-9._-]+就是正则表达式

USERNAME [a-zA-Z0-9._-]+

USER %{USERNAME}

EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+

[root@node2006 logstash]#

```

示例:

[root@node2006 logstash]# cat text.conf

input {

stdin {

}

}

filter {

grok {

match => {

"message" => "\[%{TIMESTAMP_ISO8601:time}\]\|%{IP:remote_addr}\|%{WORD:request_method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:httpversion}\|%{NUMBER:status}"

}

}

}

output {

stdout{

codec => rubydebug

}

}

[root@node2006 logstash]# bin/logstash -f text.conf #执行配置文件,并提供数据,根据配置文件中配置的解析数据。

[2018-12-12T10:11:38+08:00]|218.94.48.186|POST /siteapp/users/findUserInfoById HTTP/1.1|200

...

{

"host" => "node2006",

"httpversion" => "1.1",

"time" => "2018-12-12T10:11:38+08:00",

"@version" => "1",

"@timestamp" => 2019-01-26T06:25:35.801Z,

"request_uri" => "/siteapp/users/findUserInfoById",

"remote_addr" => "218.94.48.186",

"request_method" => "POST",

"status" => "200",

"message" => "[2018-12-12T10:11:38+08:00]|218.94.48.186|POST /siteapp/users/findUserInfoById HTTP/1.1|200"

}

上述解析出来的数据,"message"明显是重复的数据耗费存储,且如"status"等数据类型应该是数字,方便科学计算。

使用dissect插件实现与grok同样效果:

[root@node2006 logstash]# cat text.conf

input {

stdin {}

}

filter {

dissect {

mapping => {

"message" => "[%{time}]|%{remote_addr}|%{verb} %{request} HTTP/%{httpversion}|%{status}"

}

}

}

output {

stdout{

codec => rubydebug

}

}

[root@node2006 logstash]# bin/logstash -f text.conf

Sending Logstash logs to /usr/local/pkg/logstash/logs which is now configured via log4j2.properties

{

"remote_addr" => "218.94.48.186",

"status" => "200",

"request" => "/siteapp/users/findUserInfoById",

"@timestamp" => 2019-01-26T07:40:31.354Z,

"time" => "2018-12-12T10:11:38+08:00",

"httpversion" => "1.1",

"@version" => "1",

"verb" => "POST",

"message" => "[2018-12-12T10:11:38+08:00]|218.94.48.186|POST /siteapp/users/findUserInfoById HTTP/1.1|200",

"host" => "node2006"

}

常用配置选项:

参数

输入类型

默认值

解释

keep_on_match

boole

false

如果为true,将空捕获保留为事件字段

match

hash

{}

定义映射位置

overwrite

array

[]

覆盖已存在的字段中的值,目的是保留最重要的字段

patterns_dir

array

[]

Logstash默认带有一堆模式,当这些模式不适合你时,您自己增加正则匹配时,就可将正则写在此参数的目录下的所有文件

patterns_files_glob

string

*

选择patterns_dir指定的目录中的某个模式文件

tag_on_failure

array

["_grokparsefailure"]

没有成功匹配时,将些值附加到字段

下面提供一个对nginx日志的完整配置示例:

[root@node2006 logstash]# cat text.conf

input {

file {

path => "/tmp/text.log"

start_position => "beginning"

sincedb_path => "/dev/null"

}

}

filter {

grok {

match => {

patterns_dir => ["/usr/local/pkg/logstash/patterns"]

"message" => "%{STANDARDNGINXLOG}"

}

remove_field => ["message"]

}

mutate {

convert => {

"httpversion" => "float"

"response" => "integer"

"bytes" => "integer"

}

}

}

output {

stdout{

codec => rubydebug

}

}

[root@node2006 logstash]# cat patterns/nginx #查看统一管理的正则匹配

STANDARDNGINXLOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)

[root@node2006 logstash]#

[root@node2006 logstash]# cat /tmp/text.log #这里存放了一条nginx标准日志

192.168.2.55 - - [24/Jan/2019:12:25:04 -0500] "GET / HTTP/1.1" 200 985 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" "-"

[root@node2006 logstash]#

[root@node2006 logstash]# bin/logstash -f text.conf #可以看到相应的几个字段类型已经修改成功,且将不需要message字段删除了。

{

"auth" => "-",

"bytes" => 985,

"host" => "node2006",

"response" => 200,

"request" => "/",

"timestamp" => "24/Jan/2019:12:25:04 -0500",

"httpversion" => 1.1,

"clientip" => "192.168.2.55",

"@timestamp" => 2019-01-26T12:29:42.429Z,

"ident" => "-",

"@version" => "1",

"verb" => "GET",

"path" => "/tmp/text.log"

}

Grok过滤器是Logstash中一种用于解析和匹配日志消息的工具。它使用正则表达式来匹配文本模式,并将匹配的值存储在新字段中。然而,当模式不匹配时,Grok过滤器可能会遇到性能问题。为了解决这个问题,可以考虑改用基于分隔符的Dissect过滤器,它比基于正则表达式的过滤器更容易编写和使用。不幸的是,目前还没有针对此的应用程序。要使用Grok过滤器,可以在配置文件中指定字段名称和匹配模式,如: ``` filter { grok { match => [ "message", "%{USERNAME:user}" ] } } ``` 这将从"message"字段中提取匹配的用户名,并将其存储在新的"user"字段中。另一方面,如果想在Logstash中改变应用程序的日志记录模式,可能会增加直接日志读取的困难。在这种情况下,可以考虑使用Logstash的Dissect过滤器,并进行相应的配置。一个可能的配置示例如下: ``` filter { dissect { mapping => { "message" => ... } } mutate { strip => [ "log", "class" ] } } ``` 这个配置将使用Dissect过滤器根据指定的映射将日志消息拆分成多个字段,并通过mutate过滤器删除不需要的字段,例如"log"和"class"。综上所述,Grok过滤器是Logstash中用于解析和匹配日志消息的一种工具,而Dissect过滤器则是一种更简单易用的基于分隔符的过滤器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Logstash:如何使用 Logstash Grok 过滤器提取模式](https://blog.csdn.net/UbuntuTouch/article/details/107512971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值