云原生中nginx ingress日志结构化采集需配置log-format-upstream为json模板,通过fluent bit/vector采集并注入元信息,最终送入es/loki实现可观测闭环。

在云原生架构中,Nginx Ingress 日志结构化采集的核心是:让日志输出为标准 JSON 格式,并通过可观测性链路(如 Fluentd / Fluent Bit / Vector)统一收集、过滤、转发至 Elasticsearch、Loki 或其他后端。
配置 Nginx Ingress Controller 输出 JSON 日志
Nginx Ingress Controller 默认使用文本格式写入 access log。要结构化,需自定义 log-format-upstream 参数,将其设为 JSON 字符串模板。关键点:
- 使用
--log-format-upstream启动参数(或 Helm values 中的controller.config.log-format-upstream)覆盖默认格式 - 模板中所有字段必须用双引号包裹,键名保持小写和下划线风格(如
"upstream_status"),避免非法 JSON - 支持的变量参考 官方文档,常用字段包括:
$status、$request_length、$upstream_response_length、$remote_addr、$request_time、$host、$request_uri、$http_user_agent、$http_referer
示例值(单行,无换行):
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
"{"time":"$time_iso8601","remote_addr":"$remote_addr","host":"$host","uri":"$request_uri","method":"$request_method","status":"$status","body_bytes_sent":"$body_bytes_sent","request_time":"$request_time","upstream_addr":"$upstream_addr","upstream_status":"$upstream_status","upstream_response_time":"$upstream_response_time","http_user_agent":"$http_user_agent","http_referer":"$http_referer"}"
确保日志不被转义或破坏格式
JSON 日志对格式敏感,常见问题及应对:
-
变量含空格或引号时导致 JSON 不合法:Nginx 不自动转义,建议在模板中对高风险字段(如
$http_user_agent)使用$escaped_*变量(需启用escape=json的 patch 版本);更稳妥方式是交由采集器做后期解析与转义 -
多行日志被截断:确认容器 stdout/stderr 没有额外换行;禁用 Nginx 的
log_subrequest on,避免子请求日志干扰主日志结构 -
时区不一致:统一使用
$time_iso8601(带时区偏移),避免$time_local造成时间解析混乱
采集器适配:Fluent Bit / Vector 推荐配置
结构化日志若直接走 stdout,需采集器能识别每行是完整 JSON。推荐方案:
-
Fluent Bit:设置
Parser为json,并开启Key_Name log(若日志写入容器 stdout,则默认 key 是log,需用Filter提升字段层级) -
Vector:用
parse_json转换.message字段,再用remap将 JSON 内容提升至根层级,同时添加kubernetes.pod_name等元信息 - 无论哪种采集器,都应添加
record_modifier或add_fields注入集群维度标签(如cluster_name、ingress_class),便于多租户区分
验证与可观测性闭环
上线后务必验证结构是否真正可用:
- 进入 Ingress Controller Pod,执行
tail -n 1 /var/log/nginx/access.log,确认单行输出是合法 JSON(可用jq .快速校验) - 在 Loki 或 ES 中查日志,确认各字段可被直接作为 label 或 field 查询(例如
{job="ingress-nginx"} | json | status == "502") - 建立基础看板:QPS、P95 延迟、上游错误率、TOP URI、客户端地域分布(需解析
$remote_addr或接入 GeoIP 插件)










