Apache的mod_logio模块仅记录输入/输出字节数(%I、%O),不提供任何时间字段;真实请求耗时应使用%D(微秒级处理时间)配合%v按虚拟主机分离日志来实现。
apache 的 mod_logio 模块本身不记录“tcp流转耗时”,它只记录输入/输出的字节数(如 %i 和 %o),与时间无关。
你提到的“全链路 TCP 流转耗时”(比如连接建立、请求接收、响应发送、连接关闭等各阶段耗时)不是 mod_logio 的功能范畴,也不是标准 Apache 模块直接支持的能力。
不过,根据你的实际目标(监控每个虚拟主机的请求级端到端延迟),以下是更准确、可行的路径:
1. 明确你要测的是什么耗时
常见且可落地的“耗时”指标包括:
- 请求处理总时间:从 Apache 接收到完整 HTTP 请求开始,到发出完整响应结束(即 `%D` 或 `%T`)
- 响应时间(含网络传输):客户端视角的 TTFB + 响应体传输时间 —— 这需客户端或反向代理(如 Nginx)记录
- TCP 连接建立时间:需在系统层(如 tcpdump、eBPF)或负载均衡器(如 ALB、Nginx upstream)侧捕获,Apache 无法获取 SYN/SYN-ACK 时间戳
-
%I:请求头+体的字节数(含 SSL/TLS 开销前) -
%O:响应头+体的字节数(不含 TCP/IP 包头或 TLS 封装开销)
2. 在虚拟主机中记录真实请求耗时(推荐做法)
Apache 原生支持记录每个请求的处理时间,无需额外模块(只要启用了 mod_log_config,默认已启用):
-
%D:微秒级处理时间(从接收到完整请求行起,到内核 send() 完成响应最后一字节止) -
%T:秒级处理时间(四舍五入到整秒,精度低,不建议用于分析)
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %I %O" vhost_time_io
CustomLog /var/log/apache2/vhost-access.log vhost_time_io
其中 %v 表示虚拟主机名,确保每条日志明确归属;%D 即该请求在 Apache 内部的耗时(单位:微秒)。3. 注意虚拟主机粒度与日志分离
若你托管多个站点(如 siteA.com、siteB.com),要真正实现“每个虚拟主机独立耗时统计”,需:
- 为每个
<virtualhost></virtualhost>配置单独的CustomLog路径(如/var/log/apache2/siteA-access.log) - 或统一用
%v字段 + 日志分析工具(如 awk / Logstash / Grafana Loki)按域名聚合%D - 避免所有站点共用一个日志文件却不带
%v,否则无法区分来源
%v 依赖正确的 Host 头解析,确保未被篡改或缺失。4. 如果真需要 TCP 层耗时,需外部协同
Apache 不接触 TCP 握手/挥手细节。如需采集:
-
服务端抓包:用
tcpdump -w vhost.pcap port 80 or port 443,再用 Wireshark 过滤分析 TCP RTT、SYN-ACK 延迟等(无法自动绑定到具体虚拟主机名,需结合 SNI 或 Host 头关联) -
前置代理方案:在 Apache 前加 Nginx,用
$upstream_connect_time、$upstream_header_time、$upstream_response_time等变量记录各阶段,并通过proxy_set_header X-Real-Host $host透传虚拟主机名 -
eBPF 工具(高级):用
bpftrace或tcplife跟踪每个连接生命周期,再关联进程(httpd)和监听 socket,但无法直接映射到 Apache 的ServerName
不复杂但容易忽略:耗时 ≠ 字节数,mod_logio 是 IO 计量模块,不是性能分析模块。用对字段(%D)、分清边界(Apache 内 vs TCP 层)、配好日志维度(%v),才能真正支撑虚拟主机级性能监控。

















