Apache HTTP Server 用 C 编写、不依赖 Java;mod_log_config 是其原生模块,常用于反向代理场景中配合 Java 应用记录访问日志,需确认启用、配置 LogFormat 和 CustomLog,并通过响应头(如 X-Request-ID)和 X-Forwarded-For 获取 Java 侧上下文信息。

Apache HTTP Server 本身是用 C 编写的,不依赖 Java;mod_log_config 是 Apache 的原生模块,与 Java 无关。如果你在 Java 项目中看到“Apache + mod_log_config”,通常是指:Java 应用(如 Spring Boot、Tomcat)部署在 Apache HTTP Server 前端(反向代理模式),而 Apache 负责处理静态资源、SSL 终止、访问日志等,此时才用到 mod_log_config 自定义日志格式。
确认 Apache 是否启用 mod_log_config
该模块默认已编译进大多数 Apache 发行版(如 httpd-2.4),但需确保已加载:
- 检查配置文件(如
/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf)中是否存在:
LoadModule log_config_module modules/mod_log_config.so - 运行
apachectl -M | grep log_config或a2enmod headers(Debian/Ubuntu)验证是否启用
使用 LogFormat 定义自定义日志格式
在 Apache 配置中(如 httpd.conf 或虚拟主机内),用 LogFormat 指令定义格式别名,再通过 CustomLog 引用:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined_with_xff
CustomLog /var/log/apache2/access.log combined_with_xff
说明:
立即学习“Java免费学习笔记(深入)”;
-
%h:客户端 IP(若经代理,可能为代理 IP) -
%{X-Forwarded-For}i:获取真实客户端 IP(需前端负载均衡或 Nginx/Tomcat 正确设置该 Header) -
%r:原始请求行(如GET /api/user?id=123 HTTP/1.1) -
%>s:响应状态码(记录最终返回值,非内部重定向码) -
%b:响应体字节数(不含响应头);用%B可避免对零长度响应显示 “-”
配合 Java 后端获取更精准信息
Apache 无法直接读取 Java 应用内部变量(如 Spring 的 RequestID、用户 ID),但可通过以下方式增强日志上下文:
- 让 Java 应用在响应头中写入追踪字段,例如:
response.setHeader("X-Request-ID", MDC.get("requestId"));
Apache 中即可用%{X-Request-ID}o(注意是o表示 output header)记录 - Java 端统一在反向代理后解析
X-Forwarded-For并记录真实 IP,避免 Apache 日志里全是 127.0.0.1 或代理 IP - 若使用 Tomcat,建议开启
RemoteIpValve并配置remoteIpHeader="X-Forwarded-For",确保request.getRemoteAddr()返回真实 IP,便于业务侧和 Apache 日志对齐
常见问题与建议
- 日志中出现大量
-:可能是对应字段为空(如未发送 Referer、UA 被屏蔽),属正常现象;可用%{Referer}i-显式标记缺失 - 中文路径或参数乱码:Apache 日志本身不解析 URL 编码,记录的是原始字节,查看时需用 UTF-8 编码打开日志文件
- 性能考虑:避免在
LogFormat中频繁调用高开销变量(如%{SSL_CIPHER}x在非 HTTPS 虚拟主机中会触发额外判断) - 敏感信息过滤:切勿在日志中记录
%{Authorization}i、%{Cookie}i等含 Token 或 Session 的字段,防止泄露










