可用mod_rewrite的[E=...]和SetEnvIf动态设置ENV变量,再通过CustomLog按env条件分流日志,实现基于API版本、调试参数、请求头等多维度的日志分类。

想用 mod_rewrite 配合 ENV 变量做动态日志分类,核心不是让 mod_rewrite 直接写日志,而是让它“打标签”——在请求处理早期设置环境变量,再由 CustomLog 或 SetEnvIf 按需分流。这比硬编码路径或状态码更灵活,尤其适合按业务逻辑(如 API 版本、用户角色、灰度流量)切分日志。
先确认基础模块和权限
确保以下三点已就绪:
-
mod_rewrite和mod_setenvif都已启用(a2enmod rewrite setenvif) - 若规则写在
.htaccess中,对应目录的AllowOverride必须包含FileInfo或设为All - 虚拟主机或主配置中已定义好
LogFormat,支持引用环境变量(用%{VARNAME}e)
用 RewriteRule + [E=...] 设置业务相关ENV变量
RewriteRule 的 [E=...] 标志可直接注入环境变量,适合基于 URL 路径、查询参数等动态打标。例如:
- 标记 v2 接口请求:
RewriteRule ^/api/v2/ - [E=api_version:v2] - 识别带
debug=1参数的请求:RewriteCond %{QUERY_STRING} (^|&)debug=1(&|$) [NC] RewriteRule ^ - [E=debug_request:1] - 按请求头区分内部调用:
RewriteCond %{HTTP-X-Internal-Call} ^true$ [NC] RewriteRule ^ - [E=internal_call:true]
注意:- 表示不重写路径,仅执行标志;[NC] 确保大小写不敏感;多个 [E=...] 可连写,如 [E=role:admin,E=env:prod]。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
结合 SetEnvIf 做补充匹配与排除
SetEnvIf 更擅长匹配请求头、IP、URI 模式等静态特征,常与 RewriteRule 配合使用。例如:
- 排除健康检查和静态资源:
SetEnvIf Request_URI "^/(healthz|favicon\.ico|\.js|\.css)" no_log - 根据 User-Agent 标记移动端:
SetEnvIf User-Agent "(iPhone|Android)" is_mobile - 对特定 Referer 打上防盗链标签:
SetEnvIf Referer "!^https?://(example\.com|localhost)" hotlink_attempt
这些变量后续可在 CustomLog 中通过 env=... 或 env=!... 控制是否记录,也可在 LogFormat 中用 %{is_mobile}e 输出具体值。
定制日志格式并分流到不同文件
定义含 ENV 变量的格式,再用条件 CustomLog 实现分类:
- 新建日志格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{api_version}e %{debug_request}e" api_debug - 只记录带 debug 标签的请求:
CustomLog /var/log/apache2/debug-access.log api_debug env=debug_request - 单独存 v2 接口日志:
CustomLog /var/log/apache2/api-v2.log api_debug env=api_version - 合并记录内部调用+调试请求:
SetEnvIf api_version v2 internal_debug_request SetEnvIf debug_request 1 internal_debug_request CustomLog /var/log/apache2/internal-debug.log api_debug env=internal_debug_request
这样就能把不同维度的流量精准分离,避免日志混杂,也方便后续用脚本或 ELK 做聚合分析。

















