apache默认access_log不记录压缩前/后数据体积对比,仅记录压缩后的响应体大小(%b/%b);需通过后端设置x-orig-size响应头并配合logformat实现双字段记录。

Apache 默认的访问日志(access_log)**不直接记录压缩前/后的数据体积对比**,它只记录响应体大小(%B 或 %b),即实际发送给客户端的字节数(已压缩后)。要获得“压缩前 vs 压缩后”的对比,需要额外配置和日志变量支持。
关键前提:启用压缩并暴露原始大小
Apache 本身不默认计算或暴露未压缩内容长度。需满足两个条件:
-
启用压缩模块:确保
mod_deflate已加载并启用(LoadModule deflate_module modules/mod_deflate.so); -
启用响应头捕获:通过
mod_headers和mod_setenvif配合,在压缩发生后,将原始响应大小写入环境变量或响应头中供日志引用。
可行方案:用环境变量记录原始大小
Apache 可通过 %{Content-Length}o 获取响应头中的 Content-Length,但该值在启用压缩后往往为空(因为使用 chunked 编码)。更可靠的做法是:在内容生成阶段(如 PHP、CGI 或反向代理后端)主动设置一个自定义响应头(如 X-Orig-Size),再用 LogFormat 捕获它。
示例配置片段(/etc/httpd/conf.d/compress-logging.conf):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Orig-Size}o" compress_combined
CustomLog "/var/log/httpd/access_compress.log" compress_combined
此时,只要后端应用(如 PHP 脚本)在输出前设置:header('X-Orig-Size: ' . strlen($original_content));
日志中就能同时看到 %b(压缩后字节数)和 %{X-Orig-Size}o(压缩前字节数)。
替代路径:用 mod_deflate 日志钩子(高级)
若无法修改后端,可借助 mod_deflate 的内部计数器(需 Apache ≥ 2.4.37):
- 启用
deflate模块的调试日志(LogLevel deflate:trace4),其 debug 输出会包含压缩前后大小,但仅限错误日志,不可用于 access_log; - 无标准日志字段直接提供该对比,必须通过自定义响应头 +
LogFormat实现结构化记录。
验证与查看方式
日志行示例(假设原始 12560 字节 → 压缩后 3120 字节):
192.168.1.100 - - [20/Aug/2026:10:05:22 +0800] "GET /index.html HTTP/1.1" 200 3120 "-" "Mozilla/5.0" 12560其中末尾 12560 即来自 %{X-Orig-Size}o,可与 %b(3120)做差值或比率分析(如压缩率 = 3120/12560 ≈ 24.8%)。









