必须在每个<VirtualHost>块内显式声明CustomLog和ErrorLog的绝对路径,使用带%v字段的日志格式及独立轮转机制,HTTPS虚拟主机还需单独配置ErrorLog。

要让每个虚拟主机的日志互不干扰、便于定位问题,关键不是“加功能”,而是把日志指令明确写进每个 <VirtualHost> 块里,并配好路径、格式和轮转机制。
必须在每个 VirtualHost 块内声明日志路径
Apache 默认复用主配置里的 CustomLog 和 ErrorLog。如果没在虚拟主机块里单独写,所有站点的访问和错误日志就全挤在一个文件里——查 500 错误时根本分不清是哪个域名出的问题。
- 路径必须用绝对路径,比如
/var/log/apache2/site-a-access.log,不能写logs/site-a-access.log(后者会相对ServerRoot解析,容易误判) - 目录要提前创建好:
mkdir -p /var/log/apache2/site-a,Apache 不会自动建父目录 - 确保 Apache 工作用户(如
www-data)对日志目录有写权限,否则启动报Permission denied: could not open error log file
日志格式要带 %v 字段,避免 HTTPS 下混淆
默认 combined 格式不记录请求实际匹配的虚拟主机名。在同一个 IP 上跑多个 HTTPS 站点时,光看 IP 和端口看不出是哪个域名触发了异常。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 推荐自定义格式,加入
%v(即ServerName或ServerAlias),比%{Host}i更可靠(后者可能被客户端篡改) - 示例:
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined - 然后在同个
<VirtualHost>里引用:CustomLog /var/log/apache2/site-a-access.log vhost_combined
HTTPS 虚拟主机别漏掉 ErrorLog
很多人以为 HTTP 和 HTTPS 可以共用一个错误日志,其实 SSL 握手失败、证书过期、密钥加载错误等,都只记在对应虚拟主机的 ErrorLog 里。
- 每个
<VirtualHost *:443>块里都要显式写ErrorLog /var/log/apache2/site-a-error.log - 不要依赖全局配置,也不要省略;否则排查证书问题时会找不到线索
- 多个站点共用一个
ErrorLog文件,会导致底层错误混杂(比如 A 站模块加载失败和 B 站 PHP 扩展缺失挨着出现),只能靠时间戳和 PID 区分,效率低
轮转必须按虚拟主机粒度独立配置
所有站点共用一个日志文件,再用 logrotate 或 rotatelogs 切分,Apache 会继续往旧文件句柄写,新日志就丢了。
- 用
rotatelogs:每个CustomLog单独配管道,例如CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/site-a-access.%Y%m%d.log 86400" vhost_combined - 用
logrotate:每个日志文件单独配一个/etc/logrotate.d/apache-site-a,里面指定create 644 www-data www-data,并带postrotate ... reload ... endscript - 别把一堆路径塞进同一个
logrotate配置块——Apache 不支持单次 reload 刷新多个日志文件句柄

















