Apache error_log默认warn级别导致关键线索缺失,应通过ErrorLogLevel按模块精细控制日志等级,PHP错误需单独配置php.ini中error_log路径,并确保日志文件权限、磁盘空间及logrotate正确。

Apache error_log 默认设为 warn 级别,大量关键线索(如 PHP 警告、重写规则匹配失败、模块加载异常)根本不会记录,故障时只能靠猜。真正有效的排查不是盲目调高全局日志等级,而是按需、分层、可控地增强关键路径的可见性。
优先用 ErrorLogLevel 按模块精细控制
Apache 2.4+ 推荐使用 ErrorLogLevel(旧版用 LogLevel),它支持模块级粒度,避免全局 debug 导致日志爆炸:
-
ErrorLogLevel rewrite:trace3 proxy_http:info—— 只让重写和代理模块输出详细信息,其他模块仍走默认级别 -
ErrorLogLevel authz_core:debug—— 临时排查权限拒绝问题,定位到具体认证/授权阶段 - 模块名必须准确:是
rewrite,不是rewrites;是ssl,不是mod_ssl - 常见 trace 级别:
trace1(基础匹配)、trace3(含变量展开)、trace8(全链路,慎用)
PHP 错误不进 error_log?单独配 PHP 日志目标
Apache 的 error_log 只记录服务器自身错误(如模块初始化失败),PHP 运行时错误默认由 PHP 自己处理,与 Apache 日志无关:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
php.ini中明确指定:error_log = /var/log/apache2/php_error.log - 在虚拟主机配置中用
php_admin_value error_log绑定到同一目录,确保路径一致 - 启用
php_flag display_errors off(生产禁用) +php_flag log_errors on - FPM 场景下,还需检查
www.conf中的catch_workers_output = yes
日志写不进去?先验权限、磁盘与轮转
再高的日志级别也白搭——如果 Apache 工作进程压根写不进文件,日志就静默丢失:
- 确认
ErrorLog文件及其父目录归属正确:chown www-data:www-data /var/log/apache2/error.log - 测试写入能力:
sudo -u www-data touch /var/log/apache2/error.log - 检查磁盘空间与 inode:
df -h和df -i -
logrotate配置必须含create 640 www-data www-data,否则新日志无写权限
搭配格式优化提升排查效率
光有级别不够,结构化信息才能快速关联上下文:
- 启用微秒时间戳:
ErrorLogFormat "[%{cu}t.%{msec_frac}t] [%l] [pid %P:tid %T] %7F: %E: [client %a] %M" - 在虚拟主机中加
SetEnvIf Request_URI ".*" req_id=%{UNIQUE_ID}e,再用%{req_id}e注入日志 - 配合
ErrorDocument 500 /500.html并在页面中显示%{UNIQUE_ID}e,实现前端报错与日志精准对应

















