logstash之grok插件自定义规则学习

文章目录

1、前言

近期通过ELK(Elasticsearch, Logstash, Kibana)对Nginx产生的日志进行采集(往期文章),但是在对nginx的日志格式进行预处理的时候使用到了logstash的grok的插件,特意在此为大家分享下个人的学习总结。

2、Grok提供的常用Patterns说明及举例

要学习Grok的默认表达式,我们就要找到它的具体配置路径,路径如下:

patterns路径
[logstash安装路径]/vendor/bundle/jruby/x.x.x/gems/logstash-patterns-core-x.x.x/patterns

如我的如下:

bash 复制代码
/u01/isi/application/index/logstash-7.10.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns

2.1 常用的表达式说明

链接地址:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/legacy/grok-patterns

  • USERNAME 或 USER
    用户名:由数字、大小写及特殊字符(._-)组成的字符串。如:Tom、323、isi_186等
  • EMAILLOCALPART
    电子邮件用户名部分:首位由大小写字母组成,其他位由数字、大小写及特殊字符(_.±=:)组成的字符串。
    注意,国内的QQ纯数字邮箱账号是无法匹配的,需要修改正则。比如:stone、Gary_Lu、abc-123等
  • EMAILADDRESS
    电子邮件,比如:stone@abc.com、Gary_Lu@gmail.com、abc-123@163.com等
  • HTTPDUSER
    Apache服务器的用户,可以是EMAILADDRESS或USERNAME
  • INT
    整数:包括0和正负整数,比如:0、-123、43987等
  • BASE10NUM 或 NUMBER
    十进制数字:包括整数和小数,比如:0、18、5.23等
  • BASE16NUM
    十六进制数字,整数,比如:0x0045fa2d、-0x3F8709等
  • BASE16FLOAT
    十六进制数字,整数和小数
  • WORD
    字符串,包括数字和大小写字母
    比如:String、3529345、ILoveYou等
  • NOTSPACE
    不带任何空格的字符串
  • SPACE
    空格字符串
  • QUOTEDSTRING 或 QS
    带引号的字符串,比如:"This is an apple"、'What is your name?'等
  • UUID
    标准UUID,比如:550E8400-E29B-11D4-A716-446655440000
  • MAC
    MAC地址,可以是Cisco设备里的MAC地址,也可以是通用或者Windows系统的MAC地址
  • IP
    IP地址,IPv4或IPv6地址
    比如:127.0.0.1、FE80:0000:0000:0000:AAAA:0000:00C2:0002等
  • HOSTNAME
    主机名称
  • IPORHOST
    IP或者主机名称
  • HOSTPORT
    主机名(IP)+端口,比如:127.0.0.1:3306、api.stozen.net:8000等
  • PATH
    路径,Unix系统或者Windows系统里的路径格式,比如:/usr/local/nginx/sbin/nginx、c:\windows\system32\clr.exe等
  • URIPROTO
    URI协议,比如:http、ftp等
  • URIHOST
    URI主机,比如:www.stozen.net、10.0.0.1:22等
  • URIPATH
    URI路径,比如://www.stozen.net/abc/、/api.php等
  • URIPARAM
    URI里的GET参数,比如:?a=1&b=2&c=3
  • URIPATHPARAM
    URI路径+GET参数,比如://www.stozen.net/abc/api.php?a=1&b=2&c=3
  • URI
    完整的URI,比如:http://www.stozen.net/abc/api.php?a=1\&b=2\&c=3
  • MONTH
    月份名称,比如:Jan、January等
  • MONTHNUM
    月份数字,比如:03、9、12等
  • MONTHDAY
    日期数字,比如:03、9、31等
  • DAY
    星期几名称,比如:Mon、Monday等
  • YEAR
    年份数字
  • HOUR
    小时数字
  • MINUTE
    分钟数字
  • SECOND
    秒数字
  • TIME
    时间,比如:00:01:23
  • DATE_US
    美国日期格式,比如:10-15-1982、10/15/1982等
  • DATE_EU
    欧洲日期格式,比如:15-10-1982、15/10/1982、15.10.1982等
  • ISO8601_TIMEZONE
    ISO8601时间格式,比如:+10:23、-1023等
  • TIMESTAMP_ISO8601
    ISO8601时间戳格式,比如:2016-07-03T00:34:06+08:00
  • DATE
    日期,美国日期%{DATE_US}或者欧洲日期%{DATE_EU}
  • DATESTAMP
    完整日期+时间,比如:07-03-2016 00:34:06
  • HTTPDATE
    http默认日期格式,比如:03/Jul/2016:00:36:53 +0800
  • LOGLEVEL
    Log表达式,日志等级,比如:Alert、alert、ALERT、Error等

3、使用grok插件进行日志字段处理

grok在线工具:https://www.5axxw.com/tools/v2/grok.html

但是鉴于这个太慢太卡了,我自己用docker搭建一个,总共也就三步走:

  1. docker pull epurs/grokdebugger #拉取镜像
  2. docker run -itd --name=grok -p8000:80 epurs/grokdebugger #运行容器
  3. 页面访问http://192.168.16.115:8000/

4、案例1:处理nginx的日志

4.1、查看nginx日志格式

bash 复制代码
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
  1. $remote_addr:客户端ip
  2. $remote_user:客户端的用户,通过在做了nginx访问控制后显示访问的用户名,否则为"-"
  3. $time_local:访问时间和时区
  4. $request:请求的URI和HTTP协议
  5. $status:HTTP请求状态
  6. $body_bytes_sent:发送给客户端文件内容大小
  7. $http_referer:url跳转来源
  8. $http_user_agent:用户终端浏览器等信息
  9. $http_x_forwarded_for:用户代理/蜘蛛、被转发请求的原始ip
    ``

4.2、对nginx的日志进行过滤处理

以下为nginx中的一段access.log日志

bash 复制代码
124.71.129.73 - - [15/Apr/2021:11:19:14 +0800] "GET /proxy/count.haiwainet.cn/imgpv/592/5c7498c75a6acaa1ae50.png HTTP/1.0" 404 548 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.76" "118.26.130.253"
202.168.188.174 - - [15/Apr/2021:11:19:14 +0800] "GET /rongmeiti-wenhai-hongqi/openAPI/token/reflashToken HTTP/1.1" 200 53 "-" "Apache-HttpClient/4.5.2 (Java/1.8.0_202)" "-"
124.71.129.73 - - [15/Apr/2021:11:19:14 +0800] "POST /wenhai-api/essql/getDataBySql HTTP/1.0" 200 199940 "-" "Apache-HttpClient/4.5.2 (Java/1.8.0_221)" "111.32.83.42"
124.71.129.73 - - [15/Apr/2021:11:19:14 +0800] "POST /wenhai-api/essql/getDataBySql HTTP/1.0" 200 139 "-" "Apache-HttpClient/4.5.2 (Java/1.8.0_221)" "111.32.83.42"
60.194.35.67 - - [15/Apr/2021:11:19:14 +0800] "POST /wenhaiFt-datapush/openAPI/analysis/getSearchInfosInRaw HTTP/1.1" 200 2953812 "-" "Apache-HttpClient/4.5.13 (Java/1.8.0_112)" "-"
bash 复制代码
过滤规则表达式
%{IPV4:remote_ip} \- \- \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} %{NUMBER:bytes} \"%{NOTSPACE:domain}\" \"%{GREEDYDATA:access_url}\" \"%{GREEDYDATA:real_ip}\"

5、案例2:处理tomcat的日志

5.1、安装logstash-filter-multiline

详见地址:https://blog.csdn.net/weixin_44729138/article/details/115747384

不修改tomcat的日志配置

5.2、对tomcat的日志进行过滤处理

bash 复制代码
19-Mar-2021 14:45:06.943 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/root/pkg/apache-tomcat-9.0.33/webapps/docs]
19-Mar-2021 14:45:06.953 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/root/pkg/apache-tomcat-9.0.33/webapps/docs] has finished in [10] ms
bash 复制代码
19-Mar-2021 14:45:06.555 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/root/pkg/apache-tomcat-9.0.33/temp
        org.apache.catalina.LifecycleException: Protocol handler initialization failed
                at org.apache.catalina.core.StandardService.initInternal(StandardService.java:533)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:498)
        Caused by: java.net.BindException: Address already in use
                at sun.nio.ch.Net.bind0(Native Method)
                at sun.nio.ch.Net.bind(Net.java:433)
                at sun.nio.ch.Net.bind(Net.java:425)
                at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
                at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
                at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:229)
                at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:212)
                at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1141)
                at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1154)
                at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:581)
                at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
                at org.apache.catalina.connector.Connector.initInternal(Connector.java:1010)
                ... 13 more
19-Mar-2021 14:45:06.775 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [383] milliseconds
19-Mar-2021 14:45:06.794 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
bash 复制代码
过滤规则表达式
%{NOTSPACE:Day_time} %{NOTSPACE:Day} %{LOGLEVEL} \[%{WORD}\] %{GREEDYDATA :message}
相关推荐
史努比.21 小时前
ELK 企业级日志分析系统
elk
檀越剑指大厂21 小时前
【Elasticsearch系列四】ELK Stack
大数据·elk·elasticsearch
2401_840192271 天前
ELFK日志分析平台,架构和通信
elk·elasticsearch·架构
ygqygq24 天前
ElK 8 收集 Nginx 日志
nginx·elk
纪佰伦6 天前
ELK在Linux服务器下使用docker快速部署(超详细)
linux·服务器·elk
写....写个大西瓜7 天前
【Docker部署ELK】(7.15)
elk·docker
丢爸9 天前
Linux学习-ELK(一)
linux·学习·elk
王一横不要停止努力吖12 天前
ELK学习笔记(三)——使用Filebeat8.15.0收集日志
笔记·学习·elk
王一横不要停止努力吖13 天前
ELK学习笔记(二)——使用K8S部署Kibana8.15.0
笔记·学习·elk·k8s