关键不是让日志不混在一起,而是从配置作用域、路径归属和权限控制三方面切断共享可能:每个<VirtualHost>块内必须单独指定绝对路径的ErrorLog和CustomLog,目录需独立创建并设750权限,PHP/Python/Node.js应用错误日志也须指向专属路径。

Apache 中不同域名的虚拟主机日志要完全隔离,关键不是“让日志不混在一起”,而是从配置作用域、路径归属和权限控制三方面切断共享可能。只要一个日志文件被多个 VirtualHost 共用,就谈不上隔离。
每个 块内必须单独写 ErrorLog 和 CustomLog
日志指令只有放在
- 正确写法:在每个
块里明确指定绝对路径,例如: ErrorLog /var/log/apache2/site-a-error.logCustomLog /var/log/apache2/site-a-access.log combined- HTTPS 站点也要单独配,SSL 握手错误不会记到 HTTP 日志里
- 目录需提前创建,且属主为运行 Apache 的用户(如 www-data 或 apache)
避免共用日志目录或未设权限边界
即使路径不同,若日志目录权限太宽,仍可能被其他进程误写或覆盖。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 日志目录建议用独立子目录,如
/var/log/apache2/site-a/ - 执行:
sudo mkdir -p /var/log/apache2/site-a - 再执行:
sudo chown www-data:adm /var/log/apache2/site-a - 权限设为
750,确保只有属主和属组可读写,其他人无权访问 - 禁止把所有日志都丢进
/var/log/apache2/根目录下统一管理
动态应用错误日志也得走专属路径
Apache 的 ErrorLog 不记录 PHP error_log()、Python logging.error() 这类业务错误——它们默认输出到 Apache 主进程 stderr,最终仍可能挤进同一个 error.log。
- PHP:在 VirtualHost 内加
php_admin_value error_log "/var/log/apache2/site-a-php-error.log" - Python(WSGI):在 WSGI 脚本开头配置
FileHandler指向专属路径 - Node.js(反向代理模式):直接用
winston或pino写磁盘,不依赖 Apache - 所有应用级错误路径也应归属独立目录、设独立权限
用 SetEnvIf 实现同一域名下子路径的日志分流(可选)
当多个应用部署在同一域名下(如 example.com/api 和 example.com/admin),可用请求特征进一步拆分访问日志。
- 在 VirtualHost 内添加:
SetEnvIf Request_URI "^/api/.*" api_traffic - 再写:
CustomLog /var/log/apache2/site-a-api-access.log combined env=api_traffic - 注意:这只分流访问日志,不解决错误日志混杂问题
- 错误日志仍需靠上面的 php_admin_value 或应用自身配置来隔离

















