errorlog 无法按 http 状态码或业务类型分类日志,仅记录服务器底层错误;需用 customlog + setenvif 实现 5xx 或 api 错误分流,各虚拟主机应配置独立 errorlog 路径并设置权限与轮转。

不能通过 ErrorLog 指令本身实现按 HTTP 状态码(如 404、500)或业务类型自动分类存储错误日志。ErrorLog 只记录 Apache 服务器自身的运行错误,比如模块加载失败、配置语法错误、子进程崩溃等,和请求处理结果无关。
区分两类日志:ErrorLog 不管状态码
ErrorLog 和访问状态码是两套独立机制:
-
ErrorLog:记录服务底层异常,例如
Invalid command 'SSLEngine'、Cannot load mod_php.so、child process exited with status 255 -
HTTP 状态码(404/500/403) 属于请求响应结果,由
CustomLog记录,需配合SetEnvIf或mod_rewrite实现分流
真正按“业务错误”分类,靠 CustomLog + SetEnvIf
若目标是把 5xx 错误单独存一个文件、或把特定 API 路径的异常请求归类,应使用 CustomLog 配合环境变量标记:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 匹配响应状态:
SetEnvIf Response_Status "^5" is_5xx(用"^5"比"500"更稳妥,覆盖所有 5xx) - 匹配请求路径:
SetEnvIf Request_URI "^/api/v1/(users|orders)" api_error - 写入专用日志:
CustomLog /var/log/apache2/api-5xx.log combined env=is_5xx或env=api_error
按虚拟主机分类:每个站点配独立 ErrorLog
业务隔离最实际的做法,是为每个虚拟主机配置专属的 ErrorLog 路径,避免日志混杂:
- 必须在每个
<virtualhost></virtualhost>块内显式声明:ErrorLog /var/log/apache2/site-a-error.log - 路径用绝对路径,目录需提前创建:
sudo mkdir -p /var/log/apache2/site-a - 确保 Apache 工作用户(如
www-data)有写权限:sudo chown www-data:www-data /var/log/apache2/site-a - HTTPS 虚拟主机也要单独配,SSL 握手失败、证书过期等错误只记到对应
ErrorLog
增强可追溯性:加字段、控级别、配轮转
让分类后的日志更易定位问题:
- 在
ErrorLogFormat中加入%v(虚拟主机名)或%{UNIQUE_ID}e,关联请求与错误上下文 - 用
ErrorLogLevel按需提升关键模块日志级别,如ErrorLogLevel rewrite:trace3 ssl:warn - 每个虚拟主机的日志都配独立
logrotate或rotatelogs,避免轮转时句柄失效









