Java笔记 ·

Logstash的grok表达式与Filebeat的日志过滤

9.附录

9.1 grok表达式

grok为Logstash 的Filter的一个插件,又因为存在表达式要配置,最开始当成过滤条件的配置了。随着深入了解,发现这个只是一个数据结构化转换工具,主要作用就是把String类型的字符串转为key-value形式。

比如这里的ngix logs的格式为:

 '$remote_addr - $remote_user [$msec] [$time_iso8601] sid:"$cookie_sid" "$request" '
                      '$status $body_bytes_sent ref:"$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

打印日志为:

192.168.0.221 - - [1488865947.648] [2017-03-07T13:52:27+08:00] sid:"1cbf1328-d6f4-4fa8-bb7a-768012c89419" "GET /learner/js/styles.bundle.js HTTP/1.0" 304 0  ref:"http://dev.qc.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393" "121.0.0.234"

所以上面01-logstash-initial.conf中的grok表达式为:

%{IPORHOST:[nginx][access][client_ip]} - %{DATA:[nginx][access][user_name]} %{DATA:[nginx][access][msec]} \[%{DATA:[nginx][access][time_iso8601]}\] sid:\"%{DATA:[nginx][access][cookie_sid]}\" \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} ref:\"%{DATA:[nginx][access][referer]}\" \"%{DATA:[nginx][access][user_agent]}\" \"%{DATA:[nginx][access][x_forwarded]}\"

一个小表达式的格式为%{IPORHOST:[nginx][access][client_ip]},以:分界,其中IPORHOST为grok内置表达式的匹配规则,[nginx][access][client_ip]为自定义名称,可以为任意值。最后写入时至少要用""包起来,之后也可以再加一层[]。表达式匹配规则允许自定义,具体方式可见 Grok filter plugin

可以在 http://grokdebug.herokuapp.com/ 上面在线调试所需要等 grok 正则表达式,具体操作如下图:
enter description here

9.2 过滤日志

日志的过滤工作可以在Filebeat中进行,在配置 filebeat.yml中的input时,配置好stdin类型下的include_lines或者exclude_lines即可。例:

filebeat.inputs:
- type: stdin
  ...
  include_lines: ['^ERR', '^WARN']

include_lines:正则表达式列表,用于匹配希望Filebeat包含的行。Filebeat仅导出与列表中的正则表达式匹配的行。默认情况下,将导出所有行。空行被忽略。

exclude_lines:正则表达式列表,用于匹配您希望Filebeat排除的行。Filebeat会删除与列表中的正则表达式匹配的所有行。默认情况下,不会删除任何行。空行被忽略。

如果这两个同时被定义,Filebeat将始终先执行include_lines,再执行exclude_lines。执行顺序与这两个选项的定义顺序无关。

详情可见 Stdin input

参与评论