要计算网站平均响应时间,必须启用apache日志的%d字段(微秒级),默认格式不包含;需配置logformat与customlog并重载服务;用awk提取$nf(即%d)求均值并除以1000得毫秒结果,注意排除无效值和偏差源。

要通过 Apache 访问日志计算网站的平均响应时间,核心前提是日志中必须包含响应时间字段(推荐用 %D),否则无法统计。直接解析默认日志会得到空结果——因为 Apache 默认格式(如 common 或 combined)不记录耗时。
确认日志已启用 %D 字段
检查你的 Apache 配置(如 /etc/apache2/apache2.conf 或虚拟主机文件),确保定义了含 %D 的 LogFormat,并被 CustomLog 引用:
- 正确示例:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined_with_time - 然后启用:
CustomLog /var/log/apache2/access.log combined_with_time - 运行
sudo apachectl configtest && sudo systemctl reload apache2生效 - 用
head -1 /var/log/apache2/access.log看末尾是否为一串数字(如124832),这就是微秒值
提取全站平均响应时间(毫秒)
若只需整体平均值,跳过路径过滤,直接对所有有效请求取 %D 均值:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
awk '$NF ~ /^[0-9]+$/ {sum += $NF; count++} END {if (count) print "avg:", int(sum/count), "ms"}' /var/log/apache2/access.log-
$NF 取每行最后一个字段(即 %D),用正则
^[0-9]+$排除空或破折号(-)等无效值 - 结果单位是毫秒(
%D / 1000),int()避免小数位干扰
注意常见偏差来源
算出来的“平均值”反映的是 Apache 视角的端到端处理耗时,但不是纯后端 Java 或 PHP 的执行时间:
- %D 包含:Apache 接收请求首字节、匹配规则、权限检查、反向代理转发等待、响应头发出 —— 但不含 TCP 连接建立、TLS 握手、客户端网络延迟
- %D 不含:大响应体传输时间(尤其流式接口)、SSL 握手开销、DNS 解析、CDN 缓存命中等情况下的“零处理”请求(此时 %D 可能极小,如几十微秒)
- 若发现大量 %D = 0 或
补充建议:别只看平均值
平均响应时间容易掩盖长尾问题。建议同步看分位值和状态码分布:
- 用
awk '$NF > 2000000 {print $NF/1000}' access.log | sort -n | tail -10查看最慢的 10 个请求(单位毫秒) - 加条件过滤
$9 == "200"(假设第 9 字段是状态码),排除错误请求干扰 - 结合
%U(规范化路径)做分组统计,识别具体哪个接口拖慢了全局均值










