PHP 的错误日志存放在哪里?
PHP 错误日志位置取决于实际 SAPI 与生效配置;需区分 Apache、PHP-FPM 进程日志、脚本错误与框架日志,不能仅凭固定路径定位。
一句话答案:PHP 错误日志的位置取决于运行方式与生效配置——先查当前 SAPI 的 error_log 及覆盖设置。Apache 模块未指定目标时通常走 Apache 错误日志;共享主机/cPanel 按实际 PHP handler 与站点配置确定,不能把 Apache 主日志当成全部 PHP 错误的固定位置。自定义文件路径还须具备写权限。
按运行方式对号入座
| 运行方式 | 常见日志位置 |
|---|---|
| Apache 模块(mod_php) | /var/log/apache2/error_log 或站点 vhost 配置的错误日志 |
| PHP-FPM | 区分 FPM 进程管理日志与 PHP 脚本错误日志;检查 PHP error_log 及池级 php_admin_value[error_log] |
| cPanel 主机 | 由 PHP handler 与站点配置决定;/usr/local/apache/logs/error_log 是 Apache 日志路径 |
| CLI 命令行 | 默认输出到终端 stderr |
自定义位置:php.ini
log_errors = On
error_log = /var/log/php-scripts.log
确保 PHP 进程对该路径有写权限。改完重启 Apache 或 PHP-FPM 生效。
最可靠的定位方法:问 PHP 自己
<?php phpinfo(); ?>
仅在受限访问的临时诊断页打开,检查后立即删除,避免公开配置和环境信息;搜索 error_log,看到的 Loaded Configuration File 与 error_log 值就是当前生效配置。命令行等价写法:
php -i | grep error_log
php --ini # 查看加载了哪些 ini 文件
注意 Web 模式与 CLI 模式可能加载不同的 php.ini。
应用级日志
框架(Laravel、CodeIgniter、ThinkPHP 等)还有自己的应用日志,如 Laravel 的 single 文件通道通常写入 storage/logs/laravel.log,daily、stderr 等通道目标不同,与 PHP 错误日志是两回事,排查问题时两边都要看。
找到真实日志文件后,再配置采集路径。例如用观测云 DataKit读取 PHP-FPM 或框架日志时,应分别核对运行用户、读取权限与轮转后的新文件;先触发一条测试错误,确认查询中能看到完整堆栈和正确时间。
常见问题(FAQ)
Q:phpinfo() 里 error_log 显示 no value 怎么办?
A:表示未设置,错误会走 SAPI 默认通道(Apache 模块通常写入 Apache 错误日志,CLI 通常输出到 stderr;FPM 需核对实际池与 handler 配置)。
Q:开了 log_errors 还是没有日志?
A:检查 error_reporting 级别是否包含想看的错误类型,以及目标文件对 PHP 进程用户是否可写。
Q:生产环境该用 display_errors 吗?
A:不该。生产环境 display_errors = Off、log_errors = On,错误进日志而不是页面。