在排查带宽异常或者核算服务器流量成本时,很多运维同学会发现一个头疼的问题:Apache默认的访问日志只记录了响应体的大小,也就是%b或%B变量,但请求方向传输了多少字节完全看不到。比如某个接口被恶意上传大文件,或者爬虫频繁拉取大体积资源,默认日志根本无法定位问题。这时候就需要请出Apache的mod_logio模块,它专门用于在日志中精确记录每个请求的输入和输出字节数,是流量分析场景中非常实用的工具。

mod_logio模块的工作原理
mod_logio是Apache的一个扩展日志模块,它基于mod_log_config实现,在连接和请求处理阶段挂钩计数器,统计通过网络套接字实际读写的字节数。它扩展了日志格式字符串,新增了三个关键变量:%I表示接收到的字节数(包括请求行、请求头和请求体),%O表示发送出去的字节数(包括响应头和响应体),%S则是两者的简单相加,代表本次传输的总字节数。
需要注意的是,mod_logio统计的是Apache自身与客户端之间传输的数据量。如果Apache前面还有Nginx之类的反向代理,那么它统计的只是Apache与代理服务器之间的内网流量,而不是用户与服务器之间的公网流量。这一点在解读日志数据时非常重要,否则很容易得出错误的带宽结论。
另外,如果连接启用了HTTPS,mod_logio统计的是解密之后的应用层数据,不包含TLS握手和加密填充带来的额外开销。因此它记录的字节数会比网卡层面抓包统计的流量偏小,这在做精确计费核算时需要额外留意。
如何启用mod_logio并配置日志格式
mod_logio通常随Apache主程序一起发布,但默认不一定加载。在Debian或Ubuntu系统上,可以执行a2enmod logio命令启用;在CentOS或RHEL系统上,需要编辑配置文件,找到并取消注释LoadModule logio_module modules/mod_logio.so这一行。可以通过httpd -M或apache2ctl -M命令查看已加载模块列表,确认其中包含logio_module。
模块加载后,需要在日志格式定义中使用新的变量。一段典型的配置如下:
# 启用模块(CentOS下通常写在 /etc/httpd/conf.modules.d/00-base.conf)
LoadModule logio_module modules/mod_logio.so
# 定义一个包含传输字节数的日志格式
LogFormat "%h %l %u %t \"%r\" %>s %O %I %S %D" iolog
# 应用到虚拟主机
<VirtualHost *:80>
ServerName www.ipipp.com
CustomLog logs/access_iolog.log iolog
</VirtualHost>配置完成后重启Apache服务,发起几个请求再查看日志文件,就能看到每个请求对应的输出字节数、输入字节数和总传输量了。如果只想在原有的combined格式基础上增强,也可以直接把%O %I追加到原有格式字符串末尾,保持与其他日志分析工具的兼容性。
常用字节数日志变量对比
Apache日志中涉及字节数的变量有好几个,很容易混淆,下表对它们做一个清晰对比:
| 变量 | 含义 | 是否需要mod_logio |
|---|---|---|
%b | 响应体大小,CLF格式,无内容时显示横杠 | 否 |
%B | 响应体大小,无内容时显示0 | 否 |
%I | 接收的字节数(请求行+请求头+请求体) | 是 |
%O | 发送的字节数(响应头+响应体) | 是 |
%S | 传输总字节数,等于%I与%O之和 | 是 |
从对比可以看出,%b和%B只反映响应体大小,不包含HTTP头部开销,也不包含请求方向的数据。而%O包含了响应头,%I则完整统计了客户端发来的所有数据。对于上传接口密集的服务,%I往往比%O更有分析价值;对于静态资源下载站,%O则是核算出口带宽的核心指标。
典型应用场景与注意事项
mod_logio最常见的用途是带宽核算和异常流量排查。例如通过日志分析工具对%O字段做聚合求和,可以快速算出每个站点、每个URL的出口流量占比;对%I字段按值排序,能立刻发现异常的大体积上传请求。结合%D(请求耗时微秒数)一起分析,还能评估传输速率,判断是否存在慢速连接攻击。
使用时有几个细节值得注意。第一,KeepAlive长连接上的多个请求会分别记录各自的字节数,统计是准确的;第二,如果客户端中途断开连接,已传输的部分字节数依然会被记录;第三,mod_logio与mod_log_config必须同时加载,否则Apache启动时会报未知格式变量的错误。
总结来说,mod_logio补齐了Apache流量统计的最后一块短板,配置简单、开销极低,几乎不影响性能。如果你的服务涉及流量计费、带宽监控或者上传业务,把它加进日志格式是性价比极高的改进。