Apache可通过SetEnvIf标记静态资源请求并用CustomLog env=!img过滤日志,需配置匹配.gif、.jpg等后缀的规则,修改CustomLog启用环境变量过滤,语法检查后平滑重载生效;建议结合rotatelogs日志切割和mod_expires缓存优化。

Apache 默认会把所有请求——包括图片、CSS、JS 等静态资源——都记入 access_log,导致日志体积迅速膨胀、分析效率下降,还可能掩盖真实业务访问行为。要过滤掉这些静态资源的日志记录,核心是用 SetEnvIf 标记请求,再通过 CustomLog 的 env=! 条件排除。
配置 SetEnvIf 匹配常见静态文件类型
在虚拟主机配置(如 httpd-vhosts.conf)或主配置 httpd.conf 的 <VirtualHost> 块内添加以下规则:
SetEnvIf Request_URI "\.gif$" imgSetEnvIf Request_URI "\.jpg$" imgSetEnvIf Request_URI "\.png$" imgSetEnvIf Request_URI "\.bmp$" imgSetEnvIf Request_URI "\.css$" imgSetEnvIf Request_URI "\.js$" imgSetEnvIf Request_URI "\.swf$" imgSetEnvIf Request_URI "\.woff2?$" imgSetEnvIf Request_URI "\.svg$" img
注意:正则中使用 \. 转义点号,$ 表示结尾匹配,避免误伤含类似子串的路径(如 /user.jpg/abc 不会被匹配)。
修改 CustomLog 启用环境变量过滤
找到原日志行(如 CustomLog "logs/access.log" combined),在其后加上 env=!img:
CustomLog "logs/access.log" combined env=!img
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
这表示:只记录环境变量 img 未被设置的请求,即非上述静态文件的请求。如果使用的是 common 日志格式,也一样适用。
验证与生效
完成配置后需执行两步操作:
- 检查语法:
/usr/local/apache2/bin/apachectl -t(Linux)或对应路径下的httpd.exe -t(Windows),确认输出Syntax OK - 平滑重载:
/usr/local/apache2/bin/apachectl graceful(Linux)或httpd -k graceful(Windows)
之后用 curl 或浏览器访问一个 .png 文件,再查看日志文件,该请求不应出现;而访问 /index.html 或 API 接口仍会被正常记录。
进阶建议:结合日志切割与缓存优化
过滤静态日志只是第一步,推荐同步做两件事:
-
日志自动切割:改用
rotatelogs,例如:CustomLog "|/usr/local/apache2/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined env=!img
每天生成一个带日期的新日志,避免单文件过大 -
静态资源强制缓存:启用
mod_expires模块,在同一虚拟主机中添加:<IfModule mod_expires.c><br> ExpiresActive On<br> ExpiresByType image/jpg "access plus 1 year"<br> ExpiresByType text/css "access plus 1 month"<br> ExpiresByType application/javascript "access plus 1 month"<br></IfModule>
这样既减少日志量,又降低重复请求,整体提升服务器响应效率和运维可维护性。

















