Nginx 访问日志分析案例

最近更新时间: 2024-10-17 17:10:00

简介

Nginx 作为常见的反向代理服务,在实际业务中承载着大量的服务请求。服务在运行过程中会产生大量访问日志,通常使用户面临着集群中日志分散,数据量庞大等问题,因此如何有效地收集管理这些日志数据对业务的运维及运营都有着非常重要的意义。本文以 Nginx 访问日志为例,介绍如何使用日志服务统计分析功能分析 Nginx 日志。

Nginx 日志格式

Nginx 访问日志(access.log)的格式可以通过 nginx 配置文件,/etc/nginx/nginx.conf 下的 log_format 字段来定义,如下所示。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent $request_time "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$msec"';

字段含义说明:

字段名 含义
remote_addr 客户端 IP 地址
remote_user 客户端名称
time_local 服务器本地时间
method HTTP 请求方法
url URL 地址
protocol 协议类型
status HTTP 请求状态码
body_bytes_sent 发送给客户端的字节数
request 请求响应时间(单位:秒)
http_referer 访问来源的页面链接地址
http_user_agent 客户端浏览器信息
http_x_forwarded_for 当前端有代理服务器时,追踪记录客户端真实 IP 地址的配置
msec 日志写入时间,以秒为单位,精度为毫秒的 UNIX 时间戳

说明:

使用日志分析功能,必须在索引配置中,配置待统计字段的键值索引,并开启统计。

修改索引配置后,约有1分钟生效延时。新的索引配置只对后续写入的日志数据生效。

SQL 分析示例

带宽曲线图

* | select HISTOGRAM(CAST(msec*1000 AS TIMESTAMP), INTERVAL 1 MINUTE) AS dt, round(SUM(body_bytes_sent)*8/1000.0, 2) AS "带宽(Kb/min)" group by dt order by dt limit 50

平均下载速度

* | select HISTOGRAM(CAST(msec*1000 AS TIMESTAMP), INTERVAL 1 MINUTE) AS dt, round(SUM(body_bytes_sent) * 1.0 / SUM(request_time),2) AS "下载速度(KB/s)" group by dt order by dt limit 50

uv

* | select HISTOGRAM(CAST(msec*1000 AS TIMESTAMP), INTERVAL 1 MINUTE) AS dt, count(distinct(remote_addr)) as uv group by dt order by dt limit 50

pv

* | select HISTOGRAM(CAST(msec*1000 AS TIMESTAMP), INTERVAL 1 MINUTE) AS dt, count(*) as pv group by dt order by dt limit 50

请求类型分布

* | select HISTOGRAM(CAST(msec*1000 AS TIMESTAMP), INTERVAL 1 MINUTE) AS dt, count(*) as pv, method group by dt, method order by dt limit 200