最近公司的系统遇到了并发性能问题,需要分析系统各个接口的请求和响应时间,所以提议收集Nginx日志来进行分析。
Nginx日志格式
默认的Nginx配置文件/etc/nginx/nginx.conf
|
|
日志实例
下面是几个具有典型代表的access.log日志
|
|
看到上面的日志实例,可能已经看出来不同的日志差别还是挺大的,有些日志缺少client_ip, upstream_response_time, ua等等,这些日志是阿里云健康检查的日志,所以后面我们会想办法处理这些日志的。
Nginx日志参数
|
|
注意:
从上面的描述可以看出,$request_time肯定比$upstream_response_time值大,特别是使用POST方式传递参数时,因为Nginx会把request body缓存住,接受完毕后才会把数据一起发给后端。所以如果用户网络较差,或者传递数据较大时,$request_time会比$upstream_response_time大很多。
Grok表达式
Grok表达式的调试工具推荐使用
这里定义了一个名为NGINX_ACCESS_LOGS的Grok表达式
|
|
Grok表达式的匹配结果如下:
|
|
这里使用了Logstash默认定义的一些Grok表达式,下面列举了一些常用的Grok表达式
|
|
具体内置的Grok表达式可以参考:
这里有几个地方让我有些迷惑:
- DATA和GREEDYDATA有什么区别
- client_ip是”-“的情况怎么处理
- upstream_response_time是”-“的情况怎么处理
DATA和GREEDYDATA的区别
实际上是下面正则表达式的区别
- .* : 贪婪模式
- .*? : 勉强模式
- .*+ : 侵占模式
具体区别请参考:
- http://stackoverflow.com/questions/3075130/what-is-the-difference-between-and-regular-expressions
- http://www.cnblogs.com/kevin-yuan/archive/2012/09/02/2667428.html
如何处理client_ip是”-“的情况
在Logstash中匹配client_ip为”-“的情况,然后将client_ip字段去掉,这样geoip解析的时候就不会报错了,后续会提供详细的配置文件
如何处理upstream_response_time是”-“的情况
upstream_response_time是”-“的情况比较好解决,只要稍微修改下Grok表达式即可,修改后如果upstream_response_time是”-“,Grok表达式提取出来的upstream_response_time的值就是null
|
|
以阿里云的健康检查请求日志为例:
|
|
匹配结果如下:
|
|
Logstash配置文件
这里我们尽量把处理方式简化,在单一的服务器上安装好Nginx和ELK环境,对Nginx的access.log日志进行收集,解析,最终写入到ES中。
|
|
ES的索引Template模板
上面Logstash写入日志数据到ES的时候,使用了nginx_access_logs_template.json模板,下面是ES模板的具体配置。这里我们只是把Logstash提取出来的值按照ES的Template定义好的类型写入到ES索引中。
|
|
参考文章: