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

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

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

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

自定义格式:

(?<field_name>the pattern here)

示例:

[root@node2006 logstash]# bin/logstash -e 'input{stdin{}}filter{grok{match => {"message" => "(?<request_time>\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"
}

filter-grok,dissect匹配数据的更多相关文章

  1. logstash filter grok 用法

    在elk+filebeat都安装好,且明白了基本流程后,主要的就是写logstash的filter了,以此来解析特定格式的日志 logstash的filter是用插件实现的,grok是其中一个,用来解 ...

  2. 使用Logstash filter grok过滤日志文件

    Logstash提供了一系列filter过滤plugin来处理收集到的log event,根据log event的特征去切分所需要的字段,方便kibana做visualize和dashboard的da ...

  3. ELK basic---http://udn.yyuap.com/doc/logstash-best-practice-cn/filter/grok.html

    http://blog.csdn.net/lgnlgn/article/details/8053626 elasticsearch学习入门 input {stdin{}}filter { grok { ...

  4. logstash grok 分割匹配日志

    使用logstash的时候,为了更细致的切割日志,会写一些正则表达式. 使用方法 input { file { type => "billin" path => &qu ...

  5. logstash的grok正则匹配规则文件

    文件路径:logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.0/patterns/grok-patterns 在线调试g ...

  6. C#简单爬取数据(.NET使用HTML解析器ESoup和正则两种方式匹配数据)

    一.获取数据 想弄一个数据库,由于需要一些人名,所以就去百度一下,然后发现了360图书馆中有很多人名 然后就像去复制一下,发现复制不了,需要登陆 此时f12查看源码是可以复制的,不过就算可以复制想要插 ...

  7. Servlet和Filter的url匹配以及url-pattern详解 及 filter 循环问题的解决

    Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,ser ...

  8. models语言中filter和all取数据有什么区别

    转自:http://www.bubuko.com/infodetail-1882394.html rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数 ...

  9. dubbox ExceptionMapper Filter request response 数据获取 数据传递

    dubbx虽然是基于jboss的resteasy实现restfull,但是对resteasy原生的配置却不支持(可能是考虑到dubbo本事的设计模式及实现难度,但是和大部分framework的设计风格 ...

随机推荐

  1. VueCli3新特性

    升级VueCli3的理由: 1.构建速度大大加快,之前看到一个升级的例子是2的3倍速度,具体可以在自己迁移一个项 目测试下,这里的优化有默认开启了多核构建.缓存 并行和缓存 2.webpack被内置到 ...

  2. Spring Cloud Greenwich.SR4 发布了,跟不上了……

    前几天 Spring Cloud Greenwich.SR4 发布了: https://spring.io/blog/2019/11/19/spring-cloud-greenwich-sr4-rel ...

  3. 20189220余超 团队博客——阅读软件app

    项目名称 小说阅读器 项目功能 注册登录 用户信息.用户密码.用户图像修改 书籍分类 书架 书籍搜索(作者名或书籍名) 书籍阅读(仅txt格式,暂不支持PDF等其他格式) 阅读字体.背景颜色.翻页效果 ...

  4. 解决github打不开

    今天重庆电信的“临时工”把github废了. 主要是github.githubassets.com和customer-stories-feed.github.com访问不到 通过修改host的方式上g ...

  5. 依赖注入之unity(winform方式)

    依赖注入之unity(winform方式) 要讲unity就必须先了解DI和IOC及DIP,如下链接提供DI和IOC的基础:https://www.cnblogs.com/zlp520/p/12015 ...

  6. QFIL软件烧写镜像

    1.准备好需要烧写的文件 烧写之前,需要先准备好需要的文件,如下: 2.打开QFIL程序 接下来运行QFIL程序,如下: 3.选择端口 程序运行后,选择合适的端口,如下: 点击端口选择,然后选择Por ...

  7. 词向量实践(gensim)

    词向量训练步骤: 分词并去停用词 词频过滤 训练 项目完整地址:https://github.com/cyandn/practice/tree/master/Word2Vec gensim中Word2 ...

  8. windows 安装 scrapy (python3.7)

    今天想要用scrapy爬取数据,想到原来刷过机没有这个库了就重新安装了一遍 安装scrapy 需要的东西   https://pan.baidu.com/s/1kuLvGQBG8tMTCY3WDLuU ...

  9. JMeter分布式测试环境搭建(禁用SSL)

    JMeter分布式环境,一台Master,一到多台Slave,Master和Slave可以是同一台机器. 前提条件: 所有机器,包括master和slave的机器: 1.运行相同版本的JMeter 2 ...

  10. Django 路由name使用

    Django 路由name使用 name:对URL路由关系进行命名 ***以后可以根据此名称生成自己想要的URL*** # 路由 url 三种形式 url(r'^index/', views.inde ...