Apache VirtualHost 日志分离核心是每个块显式配置绝对路径的ErrorLog和CustomLog,HTTP/HTTPS须分设,配合rotatelogs按时间或大小切分,并用logrotate归档压缩。

Apache 中 VirtualHost 配置日志分离,核心是让每个站点拥有独立的错误日志和访问日志路径,避免混写。这不是高级技巧,而是生产环境的基本要求——否则查错时得在一堆无关记录里翻找,效率极低。
每个 VirtualHost 块内单独写 ErrorLog 和 CustomLog
Apache 不会自动按域名拆分日志,必须显式声明。HTTP 和 HTTPS 必须分开配,因为它们是两个独立的虚拟主机块:
-
HTTP 站点:
ErrorLog /var/log/apache2/www.example.com-http-error.log -
HTTPS 站点:
ErrorLog /var/log/apache2/www.example.com-ssl-error.log -
访问日志同理:
CustomLog /var/log/apache2/www.example.com-access.log combined
路径要用绝对地址,目录需提前创建并授权给 Apache 工作用户(如 www-data),否则启动失败。
用 rotatelogs 实现自动按天或按大小切分
直接写死文件名会导致日志无限增长。推荐用管道交给 rotatelogs 处理:
-
按天切分(北京时间):
ErrorLog "|/usr/sbin/rotatelogs -l /var/log/apache2/www.example.com-error_%Y%m%d.log 86400 480" -
按大小切分(2MB):
CustomLog "|/usr/sbin/rotatelogs /var/log/apache2/www.example.com-access_%Y%m%d_%H%M%S.log 2M" combined
-l 表示本地时间,480 是东八区偏移分钟数;确认 rotatelogs 路径存在(可用 find /usr -name rotatelogs 查)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
用 SetEnvIf 排除敏感路径的访问日志
有些请求不该进日志,比如访问 .env、.git/config 或备份目录。不能靠 <Location>,得用环境变量过滤:
- 先标记:
SetEnvIf Request_URI "\.(env|bak|log|inc)$" no_log - 再过滤:
CustomLog /var/log/apache2/www.example.com-access.log combined env=!no_log
注意:ErrorLog 无法按 URI 过滤,这类敏感请求若被拒绝,仍会记 403 错误。更稳妥的做法是配合 <FilesMatch> 直接拦截,不放行。
配合 logrotate 做归档压缩
rotatelogs 只负责滚动,长期运行仍可能占满磁盘。建议加系统级管理:
- 配置文件放在
/etc/logrotate.d/apache2(Debian)或/etc/logrotate.d/httpd(RHEL) - 设定保留 30 天、自动 gzip 压缩、每日轮转
这样既保证实时可读,又控制磁盘占用。

















