每个VirtualHost块必须显式配置CustomLog和ErrorLog指令并指定绝对路径,定义含%v的vcombined日志格式,HTTPS站点需单独设ErrorLog,日志轮转须按站点独立配置。

要在 Apache 中实现多虚拟主机独立日志存储,核心是**每个 <VirtualHost> 块内必须显式声明 CustomLog 和 ErrorLog 指令,并配好路径、格式与轮转机制**。不写,就默认共用全局日志,故障根本无法归因。
每个虚拟主机块内必须单独写日志路径
Apache 不会自动为每个虚拟主机创建日志文件。如果只在主配置里写了 CustomLog logs/access.log combined,所有站点的访问日志都会挤进同一个文件。
- 必须在每个
<VirtualHost *:80>和<VirtualHost *:443>块内部,分别写: ErrorLog /var/log/apache2/example.com-error.logCustomLog /var/log/apache2/example.com-access.log vcombined- 路径必须是绝对路径(如
/var/log/...),不能用logs/...这类相对路径,否则会相对于ServerRoot解析,容易出错 - 目录需提前创建:
sudo mkdir -p /var/log/apache2/example.com - 确保 Apache 工作用户(如
www-data)有写权限:sudo chown www-data:www-data /var/log/apache2/example.com
日志格式要带 %v 字段,精准标识虚拟主机
默认 combined 格式不记录请求实际匹配的虚拟主机名。当多个 HTTPS 站点共用一个 IP 时,仅靠 IP 和端口看不出是哪个域名触发了错误。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在主配置(如
httpd.conf或apache2.conf)中定义带%v的格式: LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %{UNIQUE_ID}e" vcombined-
%v取自ServerName或ServerAlias,比%{Host}i更可靠(后者可被客户端伪造) - 每个虚拟主机中引用该格式:
CustomLog /var/log/apache2/example.com-access.log vcombined
HTTPS 虚拟主机务必单独配 ErrorLog
SSL 握手失败、证书过期、密钥加载错误等,只记入对应 <VirtualHost *:443> 的 ErrorLog,不会出现在 HTTP 站点日志里。
- 不要省略,也不要复用 HTTP 的日志路径
- 例如:
<VirtualHost *:443> ... ErrorLog /var/log/apache2/example.com-ssl-error.log ... </VirtualHost> - 否则排查证书问题时,线索直接丢失
- 多个站点共用一个
ErrorLog文件,会导致底层错误混杂(如 A 站模块加载失败和 B 站 PHP 扩展缺失紧挨出现),只能靠时间戳和 PID 区分,效率极低
轮转必须按站点粒度独立配置
所有站点共用一个日志文件,再用 logrotate 或 rotatelogs 切分,Apache 仍会往旧文件句柄写,新日志就丢数据。
- 用
rotatelogs:每个CustomLog单独配管道,例如: CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/example.com-access.%Y%m%d.log 86400" vcombined- 用
logrotate:每个日志文件单独配规则,如/etc/logrotate.d/apache-example.com,含create 644 www-data www-data和postrotate ... reload ... endscript - 禁止把多个站点日志路径塞进同一个
logrotate配置块——Apache 不支持单次 reload 刷新多个日志句柄

















