05_Nginx日志分析
如果不进行过滤,ES中存储的Nginx的日志是整行日志,在Kibana页面中只能查看到整行的日志,并没有其他太多的价值,所以我们需要对日志进行分割过滤,更有利于进行日志的分析。
学习本章需要具备一定的正则表达式知识
正则表达式
普通正则表达
| 表达式 | 含义 |
|---|---|
| . | 任意一个字符 |
| * | 前面一个字符出现0次或者多次 |
| [abc] | 中括号内任意一个字符 |
| [^adc] | 非中括号内的字符 |
| [0-9] | 数字 |
| [a-z] | 小写字母 |
| [A-Z] | 大写字母 |
| [a-zA-Z0-9] | 所有的字母和数字 |
| ^xx | 以xx开头 |
| xx$ | 以xx结尾 |
| \d | 数字 |
| \s | 空白字符 |
扩展正则表达式
| 表达式 | 含义 |
|---|---|
| ? | 前面的字符出现0或者1次 |
| + | 前面的字符出现1或者多次 |
| {n} | 前面的字符匹配n次 |
| {a,b} | 前面的字符匹配a到b次 |
| {,b} | 前面的字符匹配0到b次 |
| {a,} | 前面的字符出现a到a+次 |
| (string1 | string2) | string1 或者 string2 |
这里只是简单的列举了一些正则表达式,如果想要详细学习正则表达式的可以百度,有很多文档都写的很详细。
分享一个工具,平时自己写完正则表达式可以作为测试使用 http://tool.oschina.net/regex/
Nginx日志分析
Nginx日志说明
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
该日志未做任何修改,为Nginx默认的main日志的格式。接下来我们简单的看一下各个字段的含义
$1 访问的IP(如果经过反向代理,则该IP为反向代理服务器的IP地址)
$3 远端访问的用户
$4 访问时间
$6 请求方式
$7 访问的URL
$9 状态码
$10 请求的文件大小
$11 从哪个URL跳转过来
$12 客户端信息
$13 反向代理时获取真实IP
参考下面一个日志
45.251.100.145 - - [20/Sep/2019:19:33:33 +0800] "GET /index.html HTTP/1.1" 200 78905343 "-" "AndroidDownloadManager/8.1.0 (Linux; U; Android 8.1.0; PACT00 Build/O11019)" "120.163.153.183"
利用Logstash去提取Nginx的日志
- Grok使用(?<xxx>提取内容) 来提取xxx字段
- 提取客户端IP:(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})) # 因为nginx日志中的IP一般都是正常的IP。所以简单的匹配即可
- 提取时间: \[(?<requesttime>[^]+ \+[0-9]+)\]
- 提取请求方式: "(?<requesttype>[A-Z]+)
- 提取请求的内容:(?<requesturl>[^ ]+)
- 提取ua:"(?<ua>[^"])"
- 提取真实IP: (?<realip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))# 该形式只能匹配一个ip,如果有多个IP会报错,目前还未找到其他形式,,暂时作为一个问题放在这里。
利用Kibana的Dev tools工具,对一个日志进行一个匹配

得出如下匹配表达式
(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d\.\d" (?<status>[0-9]+) [0-9]+ "[^"]+" "(?<ua>[^"]+)" "(?<realip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})"
修改logstash配置文件
input {
file {
path => /var/log/nginx/access.log
}
}
filter {
grok {
match => {
"message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d\.\d" (?<status>[0-9]+) [0-9]+ "[^"]+" "(?<ua>[^"]+)" "(?<realip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})'
}
}
}
output {
elasticsearch {
hosts => ["http://172.16.142.141:9200"]
}
}
此时在去kibana面板中查看时,可以看到过滤出来的内容,但是如果正则表达式匹配的有问题的话,则显示为 - ,点开查看详细内容,在tag中可以看到_grokparsefailure(正则解析失败)

如果正则表达式没有问题,只是个别这样的情况,可以选择在logstash的输出中配置,不将这样的信息输出到es中,这样也就不会再kibana中看到。
output {
if "_grokparsefailure" not in [tags] and "_dateparsefailure" not in [tags]{
elasticsearch {
hosts => ["http://172.16.142.141:9200"]
}
}
}
当然如果这样配置之后,一些正则不能匹配的则不会发送的ES,可能会错过一些信息,所以,最好还是全部都发送到ES中,可以根据错误去修改正则表达式等
05_Nginx日志分析的更多相关文章
- 【转】gc日志分析工具
性能测试排查定位问题,分析调优过程中,会遇到要分析gc日志,人肉分析gc日志有时比较困难,相关图形化或命令行工具可以有效地帮助辅助分析. Gc日志参数 通过在tomcat启动脚本中添加相关参数生成gc ...
- 海量日志分析方案--logstash+kibnana+kafka
下图为唯品会在qcon上面公开的日志处理平台架构图.听后觉得有些意思,好像也可以很容易的copy一个,就动手尝试了一下. 目前只对flume===>kafka===>elacsticSea ...
- ELK+Kafka集群日志分析系统
ELK+Kafka集群分析系统部署 因为是自己本地写好的word文档复制进来的.格式有些出入还望体谅.如有错误请回复.谢谢! 一. 系统介绍 2 二. 版本说明 3 三. 服务部署 3 1) JDK部 ...
- Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍
网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...
- Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗
网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:当前页面 网站日志分析项目案例 ...
- Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析
网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...
- MyCAT日志分析
MyCAT日志对于了解MyCAT的运行信息不可获取,譬如MyCAT是否采用读写分离,对于一个查询语句,MyCAT是怎样执行的,每个分片会分发到哪个节点上等等. 默认是info级别,通过log4j.xm ...
- ELK+redis搭建nginx日志分析平台
ELK+redis搭建nginx日志分析平台发表于 2015-08-19 | 分类于 Linux/Unix | ELK简介ELKStack即Elasticsearch + Logstas ...
- Mysql慢查询和慢查询日志分析
Mysql慢查询和慢查询日志分析 众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的.下面总结一些使用过或者研究过的经验,从配置以 ...
随机推荐
- 在论坛中出现的比较难的sql问题:16(取一个字段中的数字)
原文:在论坛中出现的比较难的sql问题:16(取一个字段中的数字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 问题:取一个字段中的数字http://bbs.csdn ...
- Go part 7 反射,反射类型对象,反射值对象
反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...
- Nginx的启动、停止等命令
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍.1.启 ...
- restTemplate源码解析(目录)
restTemplate是spring实现的,基于restful风格的http请求模板.使用restTemplate可以简化请求操作的复杂性,同时规范了代码风格.本系列文章,将根据以下目录顺序,从源码 ...
- window.postMessage()实现(iframe嵌套页面)跨域消息传递
window.postMessage()方法可以安全地实现Window对象之间的跨域通信.例如,在页面和嵌入其中的iframe之间. 不同页面上的脚本允许彼此访问,当且仅当它们源自的页面共享相同的协议 ...
- iOS自动布局学习(UIView+AutoLayout)
自动布局虽然在iOS6的时候已经推出,不过由于各个原因并没有被开发组广泛使用.一方面是大家的app支持版本都是低于iOS6的,另一方面来说是Xcode支持木有现在这么好.以前由于iPhone设备相对固 ...
- java网络编程--httpurlconnection
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现.如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行.可以通过以下两个语句来 ...
- Linux安全:Linux如何防止木马
(一)解答战略 去企业面试时是有多位竞争者的,因此要注意答题的维度和高度,一定要直接秒杀竞争者,搞定高薪offer. (二)解答战术 因为Linux下的木马常常是恶意者通过Web的上传目录的方式来上传 ...
- 解决Apache启动错误:httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
启动apache遇到提示: [root@bqh-119 conf]# ../bin/apachectl -thttpd: apr_sockaddr_info_get() failed for bqh- ...
- Python使用xlrd、pandas包从Excel读取数据
#coding=utf-8 # pip install xlrd import xlrd def read_from_xls(filepath,index_col_list): #filepath:读 ...