Apache error_log默认warn级别导致关键链路信息缺失,应使用ErrorLogLevel按模块(如rewrite:trace3、authz_core:debug)精细控制日志等级,并通过UNIQUE_ID注入请求标识实现精准链路追踪。

Apache error_log 默认 warn 级别太粗,关键链路信息(如重写变量展开、认证拒绝原因、代理转发细节)根本不会记录,故障时只能靠经验猜路径。真正高效的链路追踪不是全局开 debug,而是按需激活关键模块的 trace 级别,并让日志自带上下文标识,实现请求—日志—代码的精准映射。
用 ErrorLogLevel 按模块打开关键链路
Apache 2.4+ 支持模块级日志控制,避免全量 debug 日志淹没真实问题:
-
重写规则调试:加
ErrorLogLevel rewrite:trace3—— 显示 RewriteCond 变量值、RewriteRule 匹配过程、跳转前后的 URI 变化 -
权限拦截定位:临时加
ErrorLogLevel authz_core:debug—— 明确看到是哪个 Require 指令失败、由哪个 authz provider 拒绝 -
反向代理排障:设
ErrorLogLevel proxy_http:info proxy_balancer:debug—— 查看 upstream 选择逻辑、后端健康检查状态、转发头是否被篡改 - 模块名必须准确:是
rewrite不是mod_rewrite,是ssl不是mod_ssl
给每条日志注入唯一请求标识
没有请求 ID 的日志无法关联前端报错、访问日志和业务日志,链路就断了:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在虚拟主机配置中加:
SetEnvIf Request_URI ".*" req_id=%{UNIQUE_ID}e - 配合自定义日志格式:
ErrorLogFormat "[%{cu}t] [%l] [pid %P] [reqid %{req_id}e] %F: %E: [client %a] %M" - 再在
ErrorDocument 500 /500.html页面里输出%{UNIQUE_ID}e,用户反馈“页面报500”时,你立刻能从日志里 grep 出完整链路
PHP 错误必须进同一日志文件,且不依赖 display_errors
Apache 的 error_log 不收 PHP 运行错误——那是 PHP 自己的事。生产环境必须显式绑定:
- php.ini 中设:
log_errors = On+error_log = /var/log/apache2/error.log - 虚拟主机内加:
php_admin_value error_log /var/log/apache2/error.log - FPM 场景额外确认:
www.conf中catch_workers_output = yes且php_admin_value[error_log]路径一致 - 禁用
display_errors(防止敏感信息泄露),只靠日志捕获
确保日志能真正落盘,否则再细的日志也白搭
权限、磁盘、轮转三者任一出问题,日志就静默丢失:
- 检查属主:
chown www-data:www-data /var/log/apache2/error.log;父目录也要可写 - 验证写入:
sudo -u www-data sh -c 'echo test >> /var/log/apache2/error.log' - 查磁盘与 inode:
df -h /var/log和df -i /var/log - logrotate 配置必须含:
create 640 www-data www-data,否则 rotate 后新文件无写权限

















