nginx日志中区分业务线的核心是变量透传与日志格式定制,可通过$host、map映射或$sent_http_x_service_name获取业务标签,并配合access_log指令按业务分离日志文件。

在 Nginx 日志中加入自定义文本标签区分业务线,核心是利用变量透传 + 日志格式定制,不依赖后端修改也能快速生效。
用 $host 或 $server_name 标识业务入口
如果各业务线通过不同域名接入(如 pay.example.com、api.example.com),直接在 log_format 中使用 $host 最简单可靠:
- 它天然反映请求所匹配的 server 块,无需额外判断
- 避免因 rewrite 或 proxy_pass 导致的逻辑错位
- 示例配置:
log_format biz '$host $remote_addr - [$time_local] "$request" $status $body_bytes_sent';
用 map 指令映射业务名称(推荐)
当域名不能直接代表业务(比如都走 api.example.com,靠 path 或 header 区分),用 map 构建语义化标签更灵活:
- 支持按 location、请求头、参数等多维度识别业务线
- 可统一 fallback,比如未匹配时设为 "unknown"
- 示例:
map $host:$uri $biz_tag {
default "unknown";
"pay.example.com:/v1/order" "payment";
"api.example.com:/user" "user-center";
"api.example.com:/order" "order-service";
}
log_format main '$biz_tag $remote_addr "$request" $status $request_time';
透传后端返回的业务标识头
若后端已在响应头中写入 X-Service-Name 或 X-Biz-Tag,Nginx 可直接捕获并写入日志:
- 使用 $sent_http_x_service_name 变量(注意:短横线转下划线,全小写)
- 需确保后端真实返回该头,否则日志中显示 "-"
- 增强健壮性可搭配 map fallback:
map $sent_http_x_service_name $log_biz {
"" "unlabeled";
default $sent_http_x_service_name;
}
log_format main '$log_biz $request_id ...';
配合 access_log 指令按业务分离日志文件
光加标签还不够,实际运维中常需物理隔离:
- 在对应 server 或 location 块中指定不同 access_log 路径
location /v1/payment {
access_log /var/log/nginx/payment_access.log main;
proxy_pass http://payment_backend;
} - 或用变量动态生成路径(需开启 log_subrequest on 支持子请求)
- 分离后便于用 logrotate 独立管理、SLS/Grafana 单独采集分析











