直接在Nginx的http或server块中定义标准化JSON log_format并绑定access_log,即可实现零清洗结构化日志收集;需用单引号包裹JSON字符串,数字字段不加引号、字符串字段加双引号,避免空格与特殊字符变量,确保每行均为合法JSON。

直接在 Nginx 的 http 或 server 块中定义 JSON 格式的 log_format,并确保字段名统一、无空格、无嵌套,即可实现请求路径与状态码的零清洗结构化收集。
定义标准化 JSON log_format
使用 log_format 指令声明纯 JSON 字符串,所有字段用双引号包裹,键名固定(如 "uri"、"status"),值用 Nginx 变量填充。注意:必须用单引号包裹整个 JSON 字符串,避免引号冲突;变量需用 $ 引用,且不加额外空格或换行。
log_format json_log '{"time":"$time_iso8601","uri":"$uri","args":"$args","status":$status,"upstream_status":"$upstream_status","request_time":$request_time,"upstream_response_time":"$upstream_response_time","bytes_sent":$bytes_sent,"body_bytes_sent":$body_bytes_sent,"http_user_agent":"$http_user_agent","http_x_forwarded_for":"$http_x_forwarded_for","remote_addr":"$remote_addr"}';- 关键点:
$status和$uri直接输出原始值,无需转义;数字型字段(如status)不加引号,字符串型字段(如uri)必须加双引号;避免使用$request等含空格/特殊字符的变量,否则 JSON 不合法
绑定 access_log 并启用 JSON 输出
在 server 或 location 块中启用该格式日志,指定文件路径,并添加 buffer 和 flush 提升写入稳定性:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
access_log /var/log/nginx/access_json.log json_log buffer=32k flush=1s;- 确保目标目录可写,日志轮转工具(如 logrotate)需适配
.log后缀;若对接 ELK 或 Loki,建议关闭gzip压缩(Nginx 不支持 JSON 日志压缩),由采集端处理
验证 JSON 合法性与字段完整性
触发一次请求后,检查日志首行是否为合法 JSON(可用 jq -n . 或在线 JSON 验证器);重点确认 uri 和 status 是否存在且格式正确:
- 错误示例:
{"uri":"/api/v1/user","status":}(status 缺失 → 检查变量拼写,应为$status而非$staus) - 正确示例:
{"time":"2024-05-20T10:30:45+08:00","uri":"/health","status":200,"http_user_agent":"curl/7.68.0"} - 调试技巧:临时添加
echo "$uri $status" > /tmp/debug.log在 location 中,比对变量实际值
对接日志采集系统时的注意事项
多数采集器(Filebeat、Fluent Bit)默认按行解析,只要每行是完整 JSON 即可自动提取字段;无需额外 grok 或 parser:
- Filebeat 示例配置片段:
processors: [{decode_json_fields: {fields: ["message"], process_array: false, max_depth: 1}}] - 确保 Nginx 日志不包含注释、空行或非 JSON 前缀(如时间戳前缀);禁用
log_format中的escape=json(Nginx 1.11+ 支持,但仅用于变量内容转义,非必需) - 若需扩展字段(如 trace_id),可在应用层注入
$http_x_request_id等自定义 header,并加入 log_format

















