Apache 支持直接用 %{HeaderName}i 记录请求头自定义字段,如 X-Request-ID;需确保上游透传、命名规范、大小写一致,并可结合 expr 语法处理空值及脱敏敏感信息。

可以直接用 %{HeaderName}i 记录请求头中的自定义字段,比如 X-Request-ID 或 X-Forwarded-For,这是 mod_log_config 原生支持的能力,无需额外模块。
确认自定义 Header 已被客户端或上游正确发送
Apache 只能记录实际到达服务器的请求头。如果 Java 应用作为后端、Apache 作反向代理,需确保:
- 上游(如 Nginx、负载均衡器或 Java 应用自身)已通过
ProxyPass+RequestHeader set或类似方式透传该 Header - Header 名称大小写不敏感,但配置中建议保持与实际一致(如
X-Trace-ID就写%{X-Trace-ID}i) - 若 Header 含空格、中文或特殊字符,可能被截断或编码,建议只用 ASCII 字母、数字和短横线命名
在 LogFormat 中直接引用请求头
使用 %{HeaderName}i 语法即可提取对应请求头的值。例如:
LogFormat "%h %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Request-ID}i\" \"%{X-Forwarded-For}i\"" custom_with_trace
CustomLog /var/log/apache2/access.log custom_with_trace
日志中将出现类似:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
处理缺失或空值的健壮写法
若某次请求未携带该 Header,%{X-Request-ID}i 默认输出短横线 -。如需统一占位符(比如空字符串或特定标记),可结合 Apache 2.4+ 的表达式语法:
-
%{expr=%{reqhdr('X-Request-ID') ?: 'MISSING'}s→ 无值时填MISSING -
%{expr=%{reqhdr('X-Forwarded-For') =~ /^([0-9.]+)/ ? $1 : '-'}s→ 提取第一个 IP
注意:表达式需启用 mod_expr(Apache 2.4 默认包含,无需额外加载)。
安全与合规注意事项
记录自定义 Header 用于审计时,需警惕敏感信息泄露:
- 避免记录含 token、密码、身份证号等字段的 Header;如必须记录,应在日志落盘前脱敏(例如用正则替换
Authorization: Bearer xxx中的xxx) - 确保日志文件权限严格(如
640),仅限日志服务与审计人员可读 - 若 Header 来自不可信客户端(如浏览器直连),应先在 Java 层校验并重写为可信标识(如
X-Auth-User-ID),再由 Apache 日志采集

















