应使用 log_format 定义结构化文本日志格式,由 prometheus-nginxlog-exporter 解析,而非让 Nginx 输出原生 Prometheus 指标;需确保字段顺序固定、分隔明确、关键变量完整、引号转义正确,且 exporter 的 format 配置与之严格一致。

直接用 log_format 配置成文本格式,再由 prometheus-nginxlog-exporter 解析,而不是让 Nginx 输出 Prometheus 原生指标。Nginx 本身不支持直接输出 Prometheus 格式(如 http_requests_total{method="GET"} 123),它只负责生成结构清晰、字段对齐的访问日志行。
用 log_format 定义 exporter 能识别的文本格式
prometheus-nginxlog-exporter 依赖正则或模板匹配日志字段,所以 log_format 要确保:
- 字段顺序固定、分隔明确(推荐空格或竖线
|分隔) - 关键变量完整:如
$remote_addr、$request、$status、$body_bytes_sent、$request_time、$upstream_response_time、$http_x_forwarded_for - 避免嵌套引号干扰解析,例如
"$request"中的空格和引号需保留原样,exporter 的 format 配置要与之严格对应
示例配置(放在 http 块内):
在 server 或 location 中启用该格式
定义后必须显式调用才能生效:
access_log /var/log/nginx/access.log prometheus;注意:access_log 路径要与 exporter 配置中的 source_files 完全一致,比如都指向 /var/log/nginx/access.log。
配套配置 prometheus-nginxlog-exporter.hcl
exporter 的 format 字段必须和上面 log_format 的输出完全匹配,包括引号、空格、顺序。常见写法:
- 所有双引号需转义为
\" - 时间字段建议用
$time_local(而非$time_iso8601),因 exporter 默认按 Apache 兼容格式解析 - 若用了
$request_id或自定义头,需在 format 中补上,并在 exporter 的 labels 或 metrics 中映射使用
验证日志是否可被正确解析
手动触发一次请求,查看日志文件是否按预期输出一行;再检查 exporter 日志是否有 parsing error。可用 tail -f /var/log/nginx/access.log 实时观察,确认每行结尾无多余空格或换行截断。
如果字段缺失(如 $upstream_response_time 在非代理场景为空),exporter 可能跳过整行——建议在反向代理配置中确保这些变量有值,或改用 map 设置默认值。











