apache的errorlog指令不支持按日志等级分类写入不同文件,只能按loglevel统一输出;实现分级需通过多虚拟主机配置不同loglevel、管道日志+外部脚本过滤或rotatelogs轮转后grep提取三种方式。

Apache 的 ErrorLog 指令本身不支持按日志等级(如 error、warn、crit)分类写入不同文件。它只能将所有符合当前 LogLevel 级别及更高级别的错误,统一写入一个目标(文件或管道)。也就是说:你设了 LogLevel warn,所有 warn、error、crit、alert、emerg 都会进同一个 ErrorLog 文件,无法自动拆分。
真正想实现“按等级分类存储”,需要换思路——不是靠 ErrorLog 拆分,而是通过多实例 + 精细控制 LogLevel + 外部工具过滤或重定向来逼近效果。以下是实用、可落地的三种方式:
用不同虚拟主机 + 不同 LogLevel 实现逻辑分级
适用于多站点环境,让关键业务站点输出更详细错误,普通站点保持简洁:
- 在
<virtualhost></virtualhost>中配置:ErrorLog /var/log/apache2/site-a-error.log LogLevel error
- 在
<virtualhost></virtualhost>(核心 API)中配置:ErrorLog /var/log/apache2/api-error-debug.log LogLevel warn
这样,
api-error-debug.log会比site-a-error.log多记录warn级别内容(如 SSL 握手警告、模块加载提示),形成事实上的“更高级别日志隔离”。
用管道日志 + 外部脚本按等级过滤
把 ErrorLog 接到一个解析脚本,实时识别 [error]、[warn] 等前缀,分发到对应文件:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ErrorLog "|/usr/local/bin/split-error-log.sh"
split-error-log.sh 示例逻辑(简化):
- 读取每行,用
awk '/\[error\]/ {print > "/var/log/apache2/error-only.log"}' - 同理匹配
\[warn\]、\[crit\]写入不同文件
⚠️ 注意:需确保脚本有权限写目标目录,且 Apache 工作用户(如www-data)能执行该脚本。
用 rotatelogs 或 cronolog 配合日志轮转 + 后期 grep 分析
不实时分离,但便于事后按需提取:
ErrorLog "|/usr/bin/rotatelogs -l /var/log/apache2/error-all-%Y%m%d.log 86400"
之后用命令快速归类:
-
grep '\[error\]' /var/log/apache2/error-all-20260605.log > error-only.log -
grep '\[crit\]\|\[alert\]' /var/log/apache2/error-all-20260605.log > critical.log
适合排查周期性问题或做周报统计,运维成本低。
不复杂但容易忽略:ErrorLog 是服务级日志,它不关心 HTTP 响应码(404/500),只管 Apache 自身运行异常;想按“5xx 响应”分类?那得用 CustomLog + SetEnvIf Response_Status "^5" ——那是访问日志的事,和错误日志无关。









