温馨提示×

ubuntu php日志为何丢失

小樊
46
2026-09-21 17:44:01
栏目: 编程语言

在 Ubuntu 上 PHP 日志“丢失”通常不是真的被删了,而是配置、权限、路径或运行方式导致日志没有写到你以为的地方。下面按最常见原因逐一说明,并给出排查方法。


一、PHP 日志写到了哪里?(先搞清楚路径)

1. CLI 模式(命令行 php)

日志位置由 php.ini 决定:

error_log = /var/log/php/php_error.log

或:

error_log = syslog

查看:

php --ini
php -i | grep error_log

2. PHP-FPM(Web 常见)

每个 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

如果没有设置:

  • 错误可能直接进 FPM 的 stdout/stderr
  • 被 systemd 接管

3. Apache + mod_php

日志通常在:

/var/log/apache2/error.log

二、最常见的“日志丢失”原因

✅ 1. log_errors = Off

log_errors = Off

✅ 错误根本不会写日志

检查:

php -i | grep log_errors

应为:

log_errors = On

✅ 2. 错误被 @ 抑制

@file_get_contents('notexist.txt');

✅ 被抑制的错误不会记录


✅ 3. 日志文件权限不足(非常常见)

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

✅ 4. PHP-FPM 没开 catch_workers_output

FPM 下 PHP 的 echo / warning 默认不进日志

在 www.conf:

catch_workers_output = yes

重启:

sudo systemctl restart php8.1-fpm

✅ 5. 日志写到了 systemd journal

如果你没配置 error_log:

error_log = syslog

查看:

journalctl -u php8.1-fpm

✅ 6. 使用了 Docker / 容器

宿主机看不到日志,因为:

  • 日志在容器内
  • 或输出到 stdout

查看:

docker logs 容器名

✅ 7. 日志被 logrotate 清掉

Ubuntu 默认:

/etc/logrotate.d/php-fpm

可能:

  • 每日轮转
  • 保留 7 天
  • 压缩删除

检查:

ls -lh /var/log/php*

三、快速自查清单(5 分钟定位)

# 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

如果你愿意,可以告诉我:

  • PHP 版本
  • 运行方式(FPM / Apache / CLI / Docker)
  • 日志“丢失”是指完全没文件,还是看不到内容

我可以直接帮你给出精准配置。

0 踩