不能。ErrorLog仅记录Apache自身底层错误,不支持按HTTP状态码分类;404/500等需用CustomLog配合SetEnvIf实现分流;多虚拟主机共用ErrorLog会导致日志混杂,建议独立配置并注意权限与轮转。

Apache虚拟主机里ErrorLog能按错误类型分开记录吗
不能。ErrorLog 指令本身不支持按 HTTP 状态码或错误类型(如 404、500)自动分类写入不同文件。它只负责把服务器运行时的错误事件(模块加载失败、配置解析错误、子进程崩溃等)统一记到指定日志文件,和访问日志里的 HTTP 状态码完全不是一回事。
ErrorLog 和访问日志里的 404/500 是两套东西
很多人想“把 500 错误单独记一个文件”,其实混淆了两类日志:
-
ErrorLog记的是 Apache 自身的底层错误,比如Invalid command 'SSLEngine'、Cannot load mod_php.so、child process exited with status 255 - HTTP 状态码(404、500、403)属于请求处理结果,归
CustomLog管,靠LogFormat+SetEnvIf或mod_rewrite配合条件日志实现分流
也就是说:你想分离 500 错误,得动 CustomLog,不是改 ErrorLog。
真要按状态码分日志,用 CustomLog + SetEnvIf 实操
在虚拟主机配置块里加这几行就能把 500 类错误单独记进 /var/log/apache2/error-5xx.log:
SetEnvIf Response_Status "^5" is_error_5xx CustomLog /var/log/apache2/error-5xx.log combined env=is_error_5xx
常见组合还有:
- 只记 404:
SetEnvIf Request_URI "^.*$" is_404; SetEnvIfNoCase Status "404" is_404,再配合CustomLog ... env=is_404 - 排除健康探测(如 /healthz):
SetEnvIf Request_URI "^/healthz" no_log,然后所有CustomLog加env=!no_log - 注意
SetEnvIf匹配的是响应头里的Status字段(格式如500 Internal Server Error),不是纯数字,所以用"^5"比"500"更稳妥
多个虚拟主机共用同一个 ErrorLog 文件会互相干扰吗
会,但不是你想的那种“干扰”。ErrorLog 是按进程/线程写入的,多个 如果指向同一个 ErrorLog 路径,它们的底层错误会混在同一个文件里——比如 A 站的 SSL 模块加载失败和 B 站的 PHP 扩展缺失会挨着出现。排查时得靠时间戳和 PID 字段区分。
更稳妥的做法是为每个虚拟主机配独立 ErrorLog:
<virtualhost>
ServerName site-a.example.com
ErrorLog /var/log/apache2/site-a-error.log
</virtualhost><virtualhost>
ServerName site-b.example.com
ErrorLog /var/log/apache2/site-b-error.log
</virtualhost>
注意路径权限:Apache 工作用户(通常是 www-data 或 apache)必须对这些目录有写权限,否则启动时会报 Permission denied: AH00096: failed to initialize logfile。
真正容易被忽略的是:修改 ErrorLog 路径后,旧日志文件不会自动轮转或清理,得靠 logrotate 配置或手动归档,否则磁盘可能被撑爆。









