需启用mod_logio模块并为各站点单独配置LogFormat与CustomLog,再通过tail+awk实时提取%O值按静态路径聚合统计带宽。

要通过 LogFormat 结合流量变量实时统计并监控各站点的静态带宽消耗,核心是让 Apache 日志准确记录每个请求实际收发的原始字节数,并按站点维度分离、采集、解析和聚合。这不是开个开关就能出图表的事,而是一套“日志增强 + 站点隔离 + 实时解析”的组合动作。
启用 mod_logio 并确认模块已加载
%I(请求字节数)和 %O(响应字节数)依赖 mod_logio 模块,该模块默认不启用:
- 运行
httpd -M | grep logio(CentOS/RHEL)或apache2ctl -M | grep logio(Debian/Ubuntu),确认输出含logio_module (shared) - 若无输出:Debian/Ubuntu 执行
a2enmod logio && systemctl restart apache2;CentOS/RHEL 则编辑/etc/httpd/conf/httpd.conf,取消#LoadModule logio_module modules/mod_logio.so的注释,再重启 httpd - 验证方式:临时在
LogFormat中加%I %O,访问一次页面,看 access_log 对应行是否输出数字——若仍为- -,说明模块未生效
为每个站点定义独立的 LogFormat 和 CustomLog
不能共用全局 common 格式,必须按虚拟主机(<virtualhost></virtualhost>)单独配置,确保日志路径和字段归属清晰:
- 在对应站点的配置块内添加:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" bandwidth_site_a
(bandwidth_site_a是自定义格式名,可按域名命名,如bandwidth_example_com) - 紧接着写:
CustomLog /www/wwwlogs/example.com.bandwidth.log bandwidth_site_a
注意:路径需真实可写,建议与宝塔默认日志分开存放,避免干扰面板统计 - 静态资源通常返回 200 +
%b非负(如 JS/CSS/PNG),但真实带宽看%O——它包含 gzip 压缩后体积、chunked 分隔符、额外响应头等,比%b更准
实时提取并聚合静态资源的 %O 消耗
日志有了,下一步是“实时”抓取静态请求的 %O 值并求和。不推荐写脚本轮询全量日志,应聚焦路径特征过滤:
- 用
tail -f流式监听,配合awk提取关键字段:tail -f /www/wwwlogs/example.com.bandwidth.log | awk '$7 ~ /\.(js|css|png|jpg|gif|webp|woff2?|ttf|svg)$/ && $6 == 200 {sum += $12} END {print "Static KB:", int(sum/1024)}'
(假设%O是第 12 列;列数需根据你LogFormat中字段顺序实际数) - 更实用的是每 10 秒汇总一次:
while true; do tail -n 100 /www/wwwlogs/example.com.bandwidth.log | awk '$7 ~ /\.(js|css|png|jpg)$/ && $6 == 200 {sum += $12} END {print strftime("%H:%M:%S"), "KB:", int(sum/1024)}'; sleep 10; done - 若使用宝塔,可在「计划任务」里添加 Shell 脚本,将每分钟结果追加到
/tmp/static_bandwidth.log,再用 Grafana 或简单网页读取展示
排除干扰,确保数据可信
以下情况会让 %O 失真,需提前规避:
- CDN 回源时,日志中
%h是 CDN 节点 IP,但%O仍是服务器发出的真实字节数——只要没开启代理缓冲(如proxy_buffering off),该值就可信;重点检查 CDN 缓存命中率,低命中率会导致重复回源拉取静态文件,放大%O总量 - PHP 或其他动态脚本生成的“伪静态”(如
/api/export.csv),虽路径像静态,但%O包含动态内容体积,需靠$7(请求路径)正则+$9(%{Content-Type}o)双重判断,或改用FilesMatch显式标记静态目录 - 日志轮转(logrotate)后,
tail -f会中断;生产环境建议用systemd-journald或rsyslog接管 Apache 日志,或使用multitail -e支持滚动重载

















