Apache 通过 mod_unique_id 为每个请求生成唯一 ID 并记录到日志,可用 %{UNIQUE_ID}e 写入;与 Java 应用协同时,建议由 Java 生成 trace ID 并通过 X-Request-ID 透传,Apache 记录 %{X-Request-ID}o。

Apache 本身不生成“会话标识”(如 Java 的 HttpSession ID),但可以通过 mod_unique_id 模块为每个请求分配一个全局唯一、服务器级的字符串 ID,并用 mod_log_config 将其写入访问日志。
启用并记录 UNIQUE_ID
该 ID 在请求生命周期内稳定,适合做请求追踪起点:
- 确认已加载
mod_unique_id:检查配置中存在LoadModule unique_id_module modules/mod_unique_id.so;Debian/Ubuntu 可运行a2enmod unique_id - 在
LogFormat中使用%{UNIQUE_ID}e占位符,例如:LogFormat "%{UNIQUE_ID}e %h %t \"%r\" %>s %b" unique_combined - 搭配
CustomLog使用:CustomLog /var/log/apache2/access.log unique_combined
与 Java 应用协同传递链路 ID
若 Apache 前置代理 Java 后端(如 Spring Boot + Tomcat),建议让 Java 应用生成并透传自己的 trace ID,Apache 仅负责记录和转发:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Java 应用在响应头中设置:
response.setHeader("X-Request-ID", MDC.get("traceId")) - Apache 配置中透传该头给后端(可选):
RequestHeader set X-Request-ID %{UNIQUE_ID}e - Apache 日志中记录 Java 返回的 ID:
%{X-Request-ID}o(注意是小写 o,表示 output header)
注意事项
UNIQUE_ID 是 Apache 内部环境变量,不是会话级或用户级标识,每次请求都不同,也不跨服务器共享。它不等同于 Java 的 session.getId() 或 OpenTelemetry 的 trace ID,但可作为轻量级请求锚点用于日志对齐和初步排查。










