Apache不支持按状态码等自动分流日志,但可通过SetEnvIf+CustomLog env=xxx实现精准条件分流;各虚拟主机可配独立日志路径;需用rotatelogs或logrotate轮转;建议在LogFormat中加入UNIQUE_ID等字段提升可追溯性。

Apache 本身不支持直接按 HTTP 状态码、URL 路径或业务类型“自动分流”访问日志到不同文件——CustomLog 指令默认只写入一个文件。但通过 SetEnvIf + CustomLog env=xxx 组合,可以实现精准的条件分流,这是生产环境最常用、最可靠的方式。
用 SetEnvIf 标记请求,再由 CustomLog 按标记写入
核心逻辑是:先用 SetEnvIf 根据请求特征(如状态码、路径、Host、User-Agent)设置环境变量;再在 CustomLog 中用 env=变量名 指定仅记录带该变量的请求。
- 记录所有 5xx 响应:
SetEnvIf Response_Status "^5" is_5xxCustomLog /var/log/apache2/5xx.log combined env=is_5xx - 记录所有 /api/ 开头的请求:
SetEnvIf Request_URI "^/api/" api_reqCustomLog /var/log/apache2/api-access.log combined env=api_req - 记录特定域名的访问(如 admin.example.com):
SetEnvIf Host "^admin\.example\.com$" admin_siteCustomLog /var/log/apache2/admin-access.log combined env=admin_site
每个虚拟主机配独立 CustomLog 路径
如果业务已按站点隔离(如多个 <virtualhost></virtualhost>),最简单有效的分流方式就是为每个站点配置专属日志路径,避免混杂:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确保每个
<virtualhost></virtualhost>块内显式声明:CustomLog /var/log/apache2/site-a-access.log combinedErrorLog /var/log/apache2/site-a-error.log - 目录需提前创建并赋权:
sudo mkdir -p /var/log/apache2/site-asudo chown www-data:www-data /var/log/apache2/site-a - HTTPS 站点同样要单独配,SSL 握手失败等错误也只会记入对应 ErrorLog
用 rotatelogs 或 logrotate 实现按时间切分
分流后的日志仍需轮转,防止单文件过大。推荐两种主流方式:
-
rotatelogs(Apache 自带):
CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/site-a-%Y%m%d.log 86400" combined
每天生成一个新文件(如site-a-20260608.log),86400 单位为秒 -
logrotate(系统级):
在/etc/logrotate.d/apache2中添加:/var/log/apache2/site-a-access.log {<br> daily<br> missingok<br> rotate 30<br> compress<br> delaycompress<br> notifempty<br> create 644 www-data www-data<br>}
补充建议:提升日志可追溯性
分流后若需快速关联错误与访问,可在日志格式中加入关键字段:
- 在
LogFormat中加入%{UNIQUE_ID}e(唯一请求 ID),便于跨 error_log 和 access_log 追踪同一请求 - 加入
%v(虚拟主机名)或%{Host}i,明确来源站点 - 示例:
LogFormat "%v %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %{UNIQUE_ID}e" vhost_combined
再用CustomLog ... vhost_combined env=xxx

















