ErrorLogFormat是Apache 2.4引入的结构化错误日志格式指令,仅定义日志内容样式(如时间、级别、PID、客户端IP、错误消息等),不控制写入位置或记录级别;需配合LogLevel使用,支持注入TraceID等业务字段,不可用于.htaccess。

ErrorLogFormat 是 Apache 2.4 引入的关键指令,用于结构化错误日志输出,替代传统固定格式,让每条错误记录具备可解析、易检索、带上下文的特性。它不控制日志写入位置或级别,只定义“这条错误信息长什么样”。
基础语法与默认行为
默认情况下,Apache 使用内置的非结构化格式,例如:
[Thu Jun 05 16:45:22.123456 2026] [core:error] [pid 12345:tid 1402123456789] [client 192.168.1.100:54321] File does not exist: /var/www/html/missing.php启用 ErrorLogFormat 后,你可以完全重写这个结构。基本写法是:
ErrorLogFormat "[time:%{cu}t] [level:%-m:%-l] [pid:%P] [client:%a] %M, referer: %R"-
%{cu}t:高精度时间(微秒级),推荐使用,避免日志排序错乱 -
%-m:%-l:模块名与错误级别缩写(如core:error),-表示左对齐、紧凑显示 -
%P:处理该请求的子进程 PID,便于关联 strace 或 gdb 调试 -
%a:真实客户端 IP(注意:若经反向代理,需配合RemoteIPHeader才准确) -
%M:核心错误消息(必含项,不可省略) -
%R:Referer 头内容(仅当请求中存在时才填充,否则为空)
增强业务可追溯性的写法
在微服务或 Java 前端网关场景下,常需将链路 ID 注入错误日志。可通过 SetEnvIf + 环境变量方式实现:
ErrorLogFormat "[time:%{cu}t] [trace:%{TRACE_ID}e] [level:%-m] [client:%a] %M"
这样每条错误日志自动携带 TraceID,可与 Java 应用日志、Kafka 消息、ELK 中的 APM 数据直接对齐。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
其他实用字段:
-
%{REQUEST_URI}e:从环境变量读取 URI(需先用SetEnv REQUEST_URI %{REQUEST_URI}e显式设置) -
%{HTTP_X_FORWARDED_FOR}i:原始请求头中的 X-Forwarded-For(注意:需确保前端可信) -
%{script_filename}e:实际执行的脚本路径(对 PHP/CGI 场景有用)
与 LogLevel 的配合要点
ErrorLogFormat 只影响格式,不改变记录哪些内容。是否记录某条错误,仍由 LogLevel 决定:
- 设为
warn:不会记录notice或info级别消息,哪怕格式里写了%-m - 虚拟主机内单独设
LogLevel error php:warn:PHP 模块的 warn 级别错误会记录,且按你定义的ErrorLogFormat输出 - 全局
LogLevel debug会产生海量日志,建议仅临时开启,配合ErrorLogFormat加上[reqid:%{UNIQUE_ID}e]方便过滤单次请求全链路
注意事项与常见陷阱
该指令不能出现在 .htaccess 中,仅支持在主配置、<VirtualHost> 或 <Directory> 块内使用。
若格式字符串中引用了不存在的变量(如误写 %{NonExistent}i),Apache 不报错,但对应位置留空,可能导致 JSON 解析失败。
使用 ErrorLog syslog: 时,ErrorLogFormat 依然生效,rsyslog 或 Fluent Bit 会收到已格式化的文本行,无需再做字段提取。

















