文章目录
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搭建一个,总共也就三步走:
- docker pull epurs/grokdebugger #拉取镜像
- docker run -itd --name=grok -p8000:80 epurs/grokdebugger #运行容器
- 页面访问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"';
- $remote_addr:客户端ip
- $remote_user:客户端的用户,通过在做了nginx访问控制后显示访问的用户名,否则为"-"
- $time_local:访问时间和时区
- $request:请求的URI和HTTP协议
- $status:HTTP请求状态
- $body_bytes_sent:发送给客户端文件内容大小
- $http_referer:url跳转来源
- $http_user_agent:用户终端浏览器等信息
- $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}