核心是让nginx日志自带业务语义:一、log_format注入用户id/utm/ua等字段;二、用nginxlog-exporter结构化解析并生成带标签的prometheus指标;三、在采集层过滤爬虫、静态资源和无效状态码;四、grafana中基于标签构建转化漏斗、渠道归因与错误下钻大盘。

直接用 Nginx 日志对接 Prometheus 做用户行为统计,核心不是“把日志塞进去”,而是让每条日志自带可聚合、可过滤、可归属的业务语义。关键在三步:日志格式注入业务字段 → 日志采集端结构化解析 → Prometheus exporter 按规则提取指标。
一、在 log_format 中埋入真实用户行为标识
Nginx 默认日志没有用户 ID、设备类型、来源渠道等维度,必须主动扩展。重点加这些变量:
- $http_x_user_id:由上游网关或 OpenResty 注入的登录态用户标识(如 uid、token hash)
- $arg_utm_source / $arg_utm_medium:前端跳转带的推广参数,用于归因来源
- $http_user_agent + $http_x_forwarded_for:配合 realip 模块获取真实设备与 IP
-
$request_uri 和 $status:组合判断有效行为(例如
/api/submit-order且status=200才算成功下单)
示例配置:
log_format user_behavior '$time_iso8601 $http_x_forwarded_for "$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$http_x_user_id" "$arg_utm_source" "$arg_utm_medium"';
access_log /var/log/nginx/user-behavior.log user_behavior;
二、用 nginxlog-exporter 解析日志并生成 Prometheus 指标
不要自己写脚本解析文本日志。推荐使用 nginxlog-exporter(轻量、Go 编写、专为该场景设计),它能实时读取日志文件,按正则匹配字段,动态生成 metrics。
- 配置中定义「订单创建」指标:
nginx_http_requests_total{event="order_submit", status="200"} - 定义「首页访问 UV」:
nginx_http_users_total{page="home", env="prod"}(需基于$http_x_user_id去重计数) - 支持 rate 计算 QPS,例如
rate(nginx_http_requests_total{event="order_submit"}[1m])
它不依赖 Kafka 或 Flink,单机部署即可支撑中小流量业务的秒级监控。
三、过滤无效请求,避免指标污染
原始日志里混着健康检查、爬虫、404、静态资源请求,直接统计会失真。必须在采集或 exporter 配置层做清洗:
- 排除常见干扰路径:
~* \.(js|css|png|jpg|gif|woff2)$ - 过滤低价值状态码:
status !~ "2.."(下单只认 2xx) - 屏蔽已知爬虫 UA:
!~ "Baiduspider|YisouSpider|Googlebot" - 建议在 Filebeat 或 nginxlog-exporter 的 filter 规则中统一处理,而不是靠 Grafana 查询时再过滤
四、Grafana 中构建可下钻的业务大盘
指标有了,可视化要围绕行为链路组织:
- 转化漏斗:展示「首页访问 → 商品页 → 加购 → 下单 → 支付成功」各环节 PV / UV / 转化率
- 按渠道拆分:用
$arg_utm_source标签聚合,看微信、APP、SEM 各自贡献 - 错误归因:叠加
status和$request_uri,快速定位哪个接口在哪个路径报错最多 - 支持点击下钻:从大盘点击「支付失败率升高」,自动跳转到对应时间范围 +
status="500" + path="/api/pay"的日志明细
整个链路不依赖 SDK 或前端埋点,全部由 Nginx 层完成,稳定、低侵入、可观测闭环完整。











