Apache无法获取TCP层SYN时间戳,但%t可记录请求首字节到达用户态的精确时间;配合%3L或%6L可输出毫秒/微秒级本地时间,如“[2026-06-04 16:02:15.789]”,用于计算端到端服务耗时。
Apache 本身不直接提供“请求到达服务器内核 TCP 层”的时间戳(比如 SYN 到达时间),但可以通过 mod_log_config 记录 Apache 开始处理请求时的精确时间,即请求首字节被读入 Apache 用户态进程的时刻——这是最贴近、最实用、且可稳定获取的「请求到达服务层」时间点。
这个时间戳由 %t 格式符提供,配合 strftime 格式控制,能输出带毫秒或微秒精度的本地或 UTC 时间。
%t 记录请求开始处理的时间戳%t 是 mod_log_config 的内置变量,表示 Apache 接收到请求第一个字节时的本地时间(非响应时间,也不是日志写入时间)。
默认格式为:[10/Jan/2024:14:22:33 +0800](秒级,带时区)
若需更高精度(如含毫秒),需组合使用 %{format}t:
%{[%Y-%m-%d %H:%M:%S.%3L}t → 输出 2026-06-04 16:02:15.123(毫秒)%{[%Y-%m-%d %H:%M:%S.%6L}t → 输出 2026-06-04 16:02:15.123456(微秒,依赖系统支持)✅ 注意:
%3L和%6L表示当前时间的毫秒/微秒部分(不是耗时),它和%D(处理耗时)无关,但两者可共存用于计算「请求到达→响应发出」的完整服务窗口。
httpd.conf 全局作用域)LogFormat "%h %{[%Y-%m-%d %H:%M:%S.%3L}t "%r" %>s %b %D" timed_with_msCustomLog "/var/log/apache2/access.log" timed_with_ms
日志效果:
192.168.1.100 [2026-06-04 16:02:15.789] "GET /api/data HTTP/1.1" 200 248 156284
→ 表示该请求于 2026-06-04 16:02:15.789 到达 Apache,处理耗时 156284 微秒(≈156 ms)
%t 记录的是 Apache accept() 后 read() 到第一个字节的时间,已排除 TCP 握手与 TLS 解密耗时(这些发生在更底层),但非常接近真实请求抵达服务端的时间。%{msec}t 或 %{usec}t:它们是 Apache 启动时的时间戳组件,不是请求到达时间。%{[%Y-%m-%d %H:%M:%S.%3L}t 并确保系统时区设置正确;也可加 TZ=UTC 环境变量(需重启 Apache)。logrotate)需支持含小数点的时间字段长度,避免截断。不复杂但容易忽略。