本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • ELK Stack
  • ELK Stack——使用Logstash grok插件分割日志字段

ELK Stack——使用Logstash grok插件分割日志字段

发布:TangLu2017-4-25 18:04分类: ELK Stack 标签: ELK ElasticSearch logstash kibana grok ELKStack

在Logstash中有许多插件提供了各种功能,最常用的插件filter就有切割插件mutate、格式化插件grok等。其中grok可以说是最常用的插件之一,它是格式化日志的最佳方式,还可以去除日志中不需要的字段。比如Nginx日志中有多个字段,包含客户端IP、访问时间、请求页面、返回状态码、客户端浏览器等信息,可以使用grok格式化为自己需要的格式然后在Kibana中展示出来,而不是像之前系统日志一样全文显示在message中

一、grok与正则表达式

grok插件使用了正则表达式来对匹配的字段进行处理,也预定义好了许多正则表达式规则,通过这些文件也可以学习很多正则写法,规则文件存放路径

/usr/local/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns

可以看到除了grok,还对haproxy、redis等服务进行了预定义

grok1.png


二、grok插件的配置说明

以一个简单的访问日志为例:

55.3.244.1 GET /index.html 15824 0.043


可以看到这个日志分有客户端IP、请求方法、请求页面等字段,如果不做拆分的话Kibana里会将所有内容都写在messages字段里。如果我们想把不同字段做分类的话,就可以用grok来进行定义,在默认配置文件里其实很多配置都已经写好了,只需要引用下:

%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

大写的单词是预定义的正则表达式,可以在patterns目录看到其具体匹配的内容。如果匹配的话,就将该字段名称重新定义为冒号后面的小写的单词。用上面那条访问日志的客户端IP来说明,它将在Kibana里被定义为client字段并单独显示出来,而不是全部塞在了message里


三、grok插件处理Apache日志示例:

input{
  file {
    path => "/usr/local/apache/logs/access_log"
    type => "apache_access.log"
    start_position => "beginning"
  }
}

filter {
  if [type] == "apache_access.log" {
    grok {
      match => {"message" => "%{COMBINEDAPACHELOG}" }
      }
  }
}

output{
  if [type] == "apache_access.log" {
    elasticsearch {
      hosts => ["192.168.44.129:9200"]
      index=> "apache_access-%{+YYYY-MM}"
    }
  }
}


线上环境的一个grok样例,将Nginx日志按需要进行了字段划分,并且去掉了部分不需要的字段(只能去除_source里的字段):

input {
  file {
    path => [ "/tmp/test.txt" ]
  }
}

filter {
  grok {
    patterns_dir => ["./patterns"]
    match => {"message" => "%{IPORHOST:remote_addr} - %{USER:remote_user} %{TIMESTAMP_ISO8601:time} %{IPORHOST:site} \"(?:%{WORD:method} %{URIPATH:url}(|%{URIPARAMC:query})(?: HTTP/%{NUMBER:htt
pversion})?|%{DATA})\" %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}|-) %{QS:http_referer} %{QS:http_user_agent} %{QS:x_forwarded_for} (((%{URIHOST:http_user_agent})(, |- )?|(-, |-)?)+) (((
%{NUMBER:upstream_status})(, |- )?|(-, |-)?)+) (((%{BASE16FLOAT:upstream_response_time})(, |- )?|(-, |-)?)+) (%{BASE16FLOAT:request_time}) %{WORD:scheme} %{IPORHOST:real_ip}"}
    remove_field => ["message","@version"]
    }
  }

output {
  elasticsearch {
    hosts => ["192.168.145.85:9200"]
    index => "test-%{+YYYY.MM.dd}"
  }
}

然后看看Kibana的日志格式,左边选择了三个字段,然后中间已经把这三个字段显示出来了,说明日志已经自动切割好了,非常直观(提示:需要注意Apache日志格式应该改为combined,否则会因为正则表达式不匹配而在tags字段出_grokparsefailure的错误)!

grok2.png

在Kibana搜索中还有一些小技巧,在Dev Tools工具的Grok Debugger工具中可以对grok规则进行测试,如果正确匹配上的话能看到相关数据;也可以按需要过滤某个字段,比如需要查看response返回为404的日志,只需要在搜索框里输入response:404即可,如图:

grok3.png

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《ELK Stack——使用Logstash grok插件分割日志字段
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-313.html  [生成短网址]

已有 0/7144 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~