如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
!GitHub Workflow Status !Docker Repository on Quay !https://goreportcard.com/badge/github.com/martin-helmich/prometheus-nginxlog-exporter !GitHub !Donate
辅助工具,用于持续读取NGINX日志文件(或任何类似日志文件)并将指标导出到Prometheus。
您可以使用简单的命令行标志配置,或创建包含更高级配置的配置文件。
$ ./prometheus-nginxlog-exporter \ -format="<格式>" \ -listen-port=4040 \ -namespace=nginx \ [日志文件路径...]
$ ./prometheus-nginxlog-exporter -config-file /path/to/config.hcl
有多种安装此导出器的方法。
此导出器的Docker镜像可在quay.io和pkg.github.com registry获取:
quay.io/martinhelmich/prometheus-nginxlog-exporter:v1docker.pkg.github.com/martin-helmich/prometheus-nginxlog-exporter/exporter:v1查看https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases%E4%BA%86%E8%A7%A3%E5%8F%AF%E7%94%A8%E7%89%88%E6%9C%AC%E5%8F%8A%E6%8B%89%E5%8F%96%E9%95%9C%E5%83%8F%E7%9A%84%E6%96%B9%E6%B3%95%E3%80%82%E9%80%9A%E5%B8%B8%E5%BB%BA%E8%AE%AE%E4%BD%BF%E7%94%A8%60v1%60%E6%A0%87%E7%AD%BE%E8%80%8C%E9%9D%9E%60latest%60%E3%80%82
按如下方式运行导出器(根据需要调整/path/to/logs和/path/to/config等路径):
$ docker run \ --name nginx-exporter \ -v /path/to/logs:/mnt/nginxlogs \ -p 4040:4040 \ quay.io/martinhelmich/prometheus-nginxlog-exporter \ mnt/nginxlogs/access.log
命令行标志和参数可直接附加到docker run命令,例如使用配置文件:
$ docker run \ --name nginx-exporter \ -p 4040:4040 \ -v /path/to/logs:/mnt/nginxlogs \ -v /path/to/config.hcl:/etc/prometheus-nginxlog-exporter.hcl \ quay.io/martinhelmich/prometheus-nginxlog-exporter \ -config-file /etc/prometheus-nginxlog-exporter.hcl
1.5.1及更新版本的每个https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases%E5%9D%87%E6%8F%90%E4%BE%9BDEB%E5%92%8CRPM%E5%8C%85%E3%80%82
$ wget https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases/download/v1.6.0/prometheus-nginxlog-exporter_1.6.0_linux_amd64.deb $ apt install prometheus-nginxlog-exporter_1.6.0_linux_amd64.deb
包依赖于systemd,并配置为自动运行:
$ systemctl status prometheus-nginxlog-exporter $ # systemctl disable prometheus-nginxlog-exporter $ # systemctl enable prometheus-nginxlog-exporter
包会在/etc/prometheus-nginxlog-exporter.hcl生成配置文件,您可根据需要调整。
如果不想使用预构建包,可下载二进制文件并手动配置systemd启动。可在https://github.com/martin-helmich/prometheus-nginxlog-exporter/blob/master/res/package/prometheus-nginxlog-exporter.service%E6%89%BE%E5%88%B0%E6%9C%8D%E5%8A%A1%E7%9A%84%E7%A4%BA%E4%BE%8B%E5%8D%95%E5%85%83%E6%96%87%E4%BB%B6%E3%80%82%E5%8F%AA%E9%9C%80%E5%B0%86%E5%8D%95%E5%85%83%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%60/etc/systemd/system%60%EF%BC%9A
$ wget -O /etc/systemd/system/prometheus-nginxlog-exporter.service https://raw.githubusercontent.com/martin-helmich/prometheus-nginxlog-exporter/master/res/package/prometheus-nginxlog-exporter.service $ systemctl enable prometheus-nginxlog-exporter $ systemctl start prometheus-nginxlog-exporter
附带的单元文件期望二进制文件位于/usr/sbin/prometheus-nginxlog-exporter(如果不使用包管理器而手动安装,可能需要放在/usr/local),配置文件位于/etc/prometheus-nginxlog-exporter.hcl。根据需要调整。
如果在Kubernetes中运行生成日志文件的服务(无论是NGINX还是任何生成类似访问日志的服务),可将导出器作为sidecar与"主"容器在同一pod中运行。
以下示例展示如何将导出器部署为sidecar,通过syslog接收主容器的日志:
yamlapiVersion: v1 kind: Pod metadata: name: nginx-example annotations: prometheus.io/scrape: "true" prometheus.io/port: "4040" spec: containers: - name: web image: nginx # ... - name: exporter image: docker.pkg.github.com/martin-helmich/prometheus-nginxlog-exporter/exporter:v1 args: ["-config-file", "/etc/prometheus-nginxlog-exporter/config.hcl"] volumeMounts: - name: exporter-config mountPath: /etc/prometheus-nginxlog-exporter volumes: - name: exporter-config configMap: name: exporter-config
在此示例中,配置文件通过exporter-config ConfigMap传递。ConfigMap可能如下所示:
yamlapiVersion: v1 kind: ConfigMap metadata: name: exporter-config data: config.hcl: | listen { port = 4040 } namespace "nginx" { source = { syslog { listen_address = "udp://127.0.0.1:5531" format = "rfc3164" } } format = "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"" labels { app = "default" } }
配置文件指示导出器通过syslog接受日志输入。要将日志转发到导出器,只需指示主容器通过syslog将访问日志发送到127.0.0.1:5531(由于主容器和sidecar共享网络命名空间,这是可行的)。
要从源码构建导出器,只需使用go get:
$ go get github.com/martin-helmich/prometheus-nginxlog-exporter
或者,克隆此仓库并运行go build:
$ git clone git://github.com/martin-helmich/prometheus-nginxlog-exporter $ cd prometheus-nginxlog-exporter $ go build
此导出器收集以下指标。收集器可同时监听多个日志文件,并在不同命名空间中发布指标。每个指标使用标签method(包含HTTP请求方法)和status(包含HTTP状态码)。
重要:请注意,其中一些指标需要访问日志格式中存在特定值(例如,
http_upstream_time_seconds指标需要访问日志包含变量$upstream_response_time)。
指标在/metrics路径导出。
导出的指标如下:
| 指标名称 | 描述 |
|---|---|
<namespace>_http_response_count_total | 已处理的HTTP请求/响应总数。 |
<namespace>_http_response_size_bytes | 传输的内容总字节数。 |
<namespace>_http_upstream_time_seconds | 上游响应时间(秒)的摘要向量。记录这些需要在NGINX中使用$upstream_response_time变量在日志格式中专门启用。 |
<namespace>_http_upstream_time_seconds_hist | 与<namespace>_http_upstream_time_seconds相同,但为直方图向量。同样需要日志格式中的$upstream_response_time变量。 |
<namespace>_http_response_time_seconds | 总响应时间(秒)的摘要向量。记录这些需要在NGINX中使用$request_time变量在日志格式中专门启用。 |
<namespace>_http_response_time_seconds_hist | 与<namespace>_http_response_time_seconds相同,但为直方图向量。同样需要日志格式中的$request_time变量。 |
可在配置文件中配置其他标签(见下文)。
<namespace>可省略或覆盖 - 详见命名空间作为标签。
可在启动时指定要读取的配置文件。配置文件预期为https://github.com/hashicorp/hcl%E6%88%96YAML%E6%A0%BC%E5%BC%8F%E3%80%82%E4%BB%A5%E4%B8%8B%E6%98%AF%E7%A4%BA%E4%BE%8B%E6%96%87%E4%BB%B6%EF%BC%9A
hcllisten { port = 4040 address = "10.1.2.3" metrics_endpoint = "/metrics" } consul { enable = true address = "localhost:8500" datacenter = "dc1" scheme = "http" token = "" service { id = "nginx-exporter" name = "nginx-exporter" address = "192.168.3.1" tags = ["foo", "bar"] } } namespace "app1" { format = "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"" source { files = [ "/var/log/nginx/app1/access.log" ] } # metrics_override = { prefix = "myprefix" } # namespace_label = "vhost" labels { app = "application-one" environment = "production" foo = "bar" } histogram_buckets = [.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10] } namespace "app2" { format = "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\" $upstream_response_time" source { files = [ "/var/log/nginx/app2/access.log" ] } }
yamllisten: port: 4040 address: "10.1.2.3" metrics_endpoint: "/metrics" consul: enable: true address: "localhost:8500" datacenter: dc1 scheme: http token: "" service: id: "nginx-exporter" name: "nginx-exporter" address: "192.168.3.1" tags: ["foo", "bar"] namespaces: - name: app1 format: "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"" source: files: - /var/log/nginx/app1/access.log # metrics_override: # prefix: "myprefix" # namespace_label: "vhost" labels: app: "application-one" environment: "production" foo: "bar" histogram_buckets: [.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10] - name: app2 format: "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\" $upstream_response_time" source: files: - /var/log/nginx/app2/access.log
出于历史原因,此导出器为不同命名空间导出单独的指标(因为命名空间是指标名称的一部分)。然而,在许多(大多数)情况下,跨不同命名空间使用相同的指标名称(具有不同的日志格式和名称)更为方便。
这可通过两个步骤实现:
metrics_override)namespace_label)hclnamespace "app1" { ... metrics_override = { prefix = "myprefix" } namespace_label = "vhost" ... } namespace "app2" { ... metrics_override = { prefix = "myprefix" } namespace_label = "vhost" ... }
导出的指标将具有以下格式:
myprefix_http_response_count_total{vhost="app1", ...} myprefix_http_response_count_total{vhost="app2", ...} ...
prefix可设置为"",生成类似http_response_count_total{...}的指标namespace_label可省略 - 因此您可完全控制指标格式有关详细信息和历史,可查看https://github.com/martin-helmich/prometheus-nginxlog-exporter/issues/13%E3%80%82
动态重标签的部分情况:
hclnamespace "app1" { format = "$remote_addr - $remote_user [$time_local] ... \"$geoip_country_code\" $upstream_addr" ... relabel "upstream_addr" { from = "upstream_addr" } relabel "country" { from = "geoip_country_code" } ... }
导出的指标将具有upstream_addr和country标签。
目前,导出器支持从以下来源读取日志数据:
所有日志源可在每个命名空间的基础上使用source属性配置。
从文件读取
从文件读取时,只需配置files属性:
hclnamespace "test" { source { files = ["/var/log/nginx/access.log"] // ... } }
从syslog读取
导出器还可打开并监听syslog端口并从中读取日志。配置如下:
hclnamespace "test" { source { syslog { listen_address = "udp://127.0.0.1:8514" <1> format = "rfc3164" <2> tags = ["nginx"] } // ... } }
<1> listen_address可以是TCP或UDP地址。尚不支持UNIX套接字(欢迎提交PR)
<2> format可以是rfc3164、rfc5424、rfc6587或auto。如果省略,默认为auto。
查看NGINX文档的相应部分了解如何设置NGINX以记录到syslog。
导出器包含当前处于实验阶段的功能,可能会在不提前通知的情况下更改。要使用这些功能,可设置-enable-experimental标志,或在配置文件中添加enable_experimental选项(在配置文件文档的根级别,如YAML中的enable_experimental: true或HCL中的enable_experimental = true)。
重标签允许您将解析的日志行中的任意字段作为标签添加到指标中。要添加动态标签,在配置文件中添加relabel语句:
hclnamespace "app-1" { // ... relabel "host" { from = "server_name" whitelist = [ <1> "host-a.com",
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。



来自真实用户的反馈,见证轩辕镜像的优质服务