博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
filter-grok,dissect匹配数据
阅读量:5149 次
发布时间:2019-06-13

本文共 5301 字,大约阅读时间需要 17 分钟。

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" => "(?
\d+\.\d+)" }}}output{stdout{codec=>rubydebug}}' #匹配带有小数点的数字,这里得到的字段值是字符串类型。logstash中只有三种类型,string,integer,float。如果不指定类型,默认string123.456...{ "message" => "123.456", "host" => "node2006", "request_time" => "123.456", "@version" => "1", "@timestamp" => 2019-01-25T06:43:37.948Z}

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

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

如果需要自己配置相应的正则规则时,建议把所有的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"}

转载于:https://www.cnblogs.com/dance-walter/p/10325190.html

你可能感兴趣的文章
Ubuntu Service说明与使用方法
查看>>
apache log 按日期记录 格式 <GOOD>-- (转)
查看>>
Python switch-case语句的实现 -- 字典模拟实现
查看>>
leetcode 111. 二叉树的最小深度(Minimum Depth of Binary Tree)
查看>>
sftp映射为本地文件夹
查看>>
网络对抗技术作业一P201421410036
查看>>
操作系统:用c++实现FIFO(先进先出)和LRU(最近最久未使用)页面置换
查看>>
Flask-数据与路由
查看>>
发邮件
查看>>
打开模态窗体,并获取返回值、刷新
查看>>
python中的单例模式
查看>>
python网络篇【第十一篇】队列、线程池
查看>>
ios view的frame和bounds之区别(位置和大小)
查看>>
switzerland, we're coming
查看>>
基于OSGi的企业级快速开发平台(开源)
查看>>
robotframework如何设计web页面的自动化---如何上传图片
查看>>
Lae程序员小漫画(二),仅供一乐
查看>>
阶乘末尾零数
查看>>
E: Sub-process /usr/bin/dpkg returned an error code (1) 出错解决方案 ...
查看>>
python3新特性函数注释Function Annotations用法分析
查看>>