在 Ubuntu 上 PHP 日志“丢失”通常不是真的被删了,而是配置、权限、路径或运行方式导致日志没有写到你以为的地方。下面按最常见原因逐一说明,并给出排查方法。
日志位置由 php.ini 决定:
error_log = /var/log/php/php_error.log
或:
error_log = syslog
查看:
php --ini
php -i | grep error_log
每个 pool 有独立配置:
; /etc/php/8.1/fpm/pool.d/www.conf
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
如果没有设置:
日志通常在:
/var/log/apache2/error.log
log_errors = Offlog_errors = Off
✅ 错误根本不会写日志
检查:
php -i | grep log_errors
应为:
log_errors = On
@ 抑制@file_get_contents('notexist.txt');
✅ 被抑制的错误不会记录
PHP-FPM 运行用户通常是:
www-data
如果日志目录不存在或不可写:
ls -ld /var/log/php
修复:
sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
sudo chmod 755 /var/log/php
catch_workers_outputFPM 下 PHP 的 echo / warning 默认不进日志
在 www.conf:
catch_workers_output = yes
重启:
sudo systemctl restart php8.1-fpm
如果你没配置 error_log:
error_log = syslog
查看:
journalctl -u php8.1-fpm
宿主机看不到日志,因为:
查看:
docker logs 容器名
Ubuntu 默认:
/etc/logrotate.d/php-fpm
可能:
检查:
ls -lh /var/log/php*
# 1. PHP 模式
php -v
# 2. 配置位置
php --ini
# 3. 错误配置
php -i | grep -E "log_errors|error_log|display_errors"
# 4. FPM 用户
ps aux | grep fpm
# 5. 实际日志
tail -f /var/log/php/*.log
journalctl -u php*-fpm -f
php.ini
log_errors = On
error_log = /var/log/php/php_error.log
display_errors = Off
php-fpm pool
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
如果你愿意,可以告诉我:
我可以直接帮你给出精准配置。