核心是用%D记录Apache微秒级耗时,需启用mod_log_config、配置LogFormat含%D并CustomLog启用;Java真实耗时须应用设X-Process-Time响应头,Apache用%{X-Process-Time}o捕获。

直接在 Apache 日志里加耗时字段,核心就是用 %D —— 它是 mod_log_config 模块原生支持的微秒级处理时间,开销小、稳定、无需额外模块。
确保 mod_log_config 已启用
运行命令检查:
httpd -M | grep log_config
看到 log_config_module (shared) 表示已加载。绝大多数 Apache 2.4+ 默认启用,不用额外操作。
在配置中定义带 %D 的日志格式
把下面这行加到 httpd.conf 或虚拟主机配置的全局作用域(不能放在 <VirtualHost> 内部嵌套位置):
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined_with_time注意:%D 放在最后最安全,避免和 URL 中空格、引号等干扰字段分割。
然后启用该格式:
CustomLog logs/access_log combined_with_time
重启或重载生效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
apachectl configtest && apachectl graceful
日志里看到的效果
一行末尾会多出一个整数,单位是微秒:
192.168.1.20 - - [13/Jun/2026:19:10:22 +0800] "GET /api/order HTTP/1.1" 200 412 "-" "Mozilla/5.0" 87432
→ 87432 微秒 ≈ 87.4 ms,即 Apache 从收到请求第一个字节,到发完响应头所用时间。
别踩这些坑
- 不要用
%T:它是秒级整数,精度丢失严重(1.99 秒记为1); - 别写
%{ms}T或%{msec}t:这不是耗时字段,而是当前时间戳的毫秒部分; -
%D为0或极小(如12、47):说明请求没真正进入业务处理,可能是静态文件直出、SSL 握手失败、被防火墙拦截,或前端 CDN 提前返回; - 字段位置不是固定的:
$12可能不对,解析日志时建议用正则\s(\d+)$匹配行尾数字,而不是按空格切分。
如果还想记录 Java 真实耗时
得让后端配合:Spring Boot 在 Filter 里用 System.nanoTime() 计算,并设响应头:
response.setHeader("X-Process-Time", String.valueOf((System.nanoTime() - start) / 1_000_000));Apache 配置里扩展日志格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Process-Time}o" full_timing注意 %{X-Process-Time}o 的 o 是 output,不是 i;若日志对应位置是 -,说明 Java 没写头,或被 Nginx/压缩模块过滤掉了。
不复杂但容易忽略

















