如何配置 Apache 记录请求到达服务器时间戳

作者:袖梨 2026-07-14
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 记录请求开始处理的时间戳

%tmod_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 启动时的时间戳组件,不是请求到达时间。
  • 若需 UTC 时间,改用 %{[%Y-%m-%d %H:%M:%S.%3L}t 并确保系统时区设置正确;也可加 TZ=UTC 环境变量(需重启 Apache)。
  • 日志轮转工具(如 logrotate)需支持含小数点的时间字段长度,避免截断。

不复杂但容易忽略。

相关文章

精彩推荐