必须为每个virtualhost单独配置绝对路径的errorlog和customlog,并创建独立子目录、设置www-data:adm属主及750权限;php/python/node.js应用日志也需指向专属路径,避免混写。

每个 <virtualhost></virtualhost> 块必须单独配置 ErrorLog 和 CustomLog,路径用绝对地址,且目录归属与权限要独立——这是实现日志路径隔离的硬性前提。
每个虚拟主机块内显式定义日志路径
Apache 不会自动为不同站点分配独立日志。全局或外部定义的日志指令会被所有虚拟主机继承,导致混写。
- 在
<virtualhost></virtualhost>或<virtualhost></virtualhost>内直接写: ErrorLog /var/log/apache2/site-a-error.logCustomLog /var/log/apache2/site-a-access.log combined- HTTPS 站点需另起一块,并单独配日志:SSL 握手失败等错误不会出现在 HTTP 日志里
日志目录提前创建并设严格权限
路径存在只是第一步,权限失控会让隔离形同虚设。
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 && sudo chmod 750 /var/log/apache2/site-a - 禁止把所有日志都丢进
/var/log/apache2/根目录下统一管理
避免应用级错误日志“悄悄混入”
PHP、Python 或 Node.js 应用抛出的错误默认不走 Apache 的 ErrorLog,而是输出到 Apache 主进程 stderr,最终仍可能挤进同一个日志文件。
- PHP:在
<virtualhost></virtualhost>内加php_admin_value error_log "/var/log/apache2/site-a-php-error.log" - Python(WSGI):在 WSGI 脚本开头用
logging.FileHandler指向专属路径 - Node.js(反向代理模式):用
winston或pino直接写磁盘,不依赖 Apache 进程输出 - 这些应用日志路径也应归属独立子目录、设独立权限
可选:按请求路径进一步分流访问日志
当多个子应用共用一个域名(如 example.com/api 和 example.com/admin),可用环境变量拆分访问日志。
- 在
<virtualhost></virtualhost>内添加:SetEnvIf Request_URI "^/api/.*" api_traffic - 再写:
CustomLog /var/log/apache2/site-a-api-access.log combined env=api_traffic - 注意:这只影响访问日志,错误日志仍需靠前面的独立路径+权限控制来隔离










