宝塔环境下php错误日志不生成,首要排查站点根目录的.user.ini是否覆盖配置:检查log_errors=off或error_log指向无效路径,注释相关行后执行bt 11重载php;再确认日志文件属主为www、权限644,父目录/www/wwwlogs/权限755可写;最后核查supervisor或计划任务是否使用绝对php路径,避免cli默认日志输出。

查 .user.ini 是否偷偷关掉了 error_log
宝塔环境下,站点根目录下的 .user.ini 会覆盖 PHP 全局配置,且优先级高于 php.ini。哪怕你确认 log_errors = On 和 error_log = /www/wwwlogs/php_error.log 都正确,只要 .user.ini 里写了 log_errors=Off 或 error_log=/tmp/xxx(路径不存在),日志就彻底静默。
实操建议:
- 进对应站点根目录(如
/www/wwwroot/example.com),用宝塔「文件管理器」打开.user.ini - 搜索
log_errors、error_log、display_errors这几行,临时在前面加;注释掉 - 保存后执行
bt 11重载 PHP,再触发一次错误(比如访问一个不存在的 PHP 文件) - 立刻
tail -f /www/wwwlogs/php_error.log看是否有输出
确认日志文件属主和权限是否匹配 www 用户
PHP-FPM 在宝塔中默认以 www 用户运行,但日志文件如果属主是 root 或权限是 600,就会拒绝写入——不报错,也不落日志,纯静默失败。
实操建议:
- 执行
ls -l /www/wwwlogs/php_error.log,检查输出中第一列是否为-rw-r--r--(即 644),第三列是否为www - 如果文件不存在,先
touch /www/wwwlogs/php_error.log,再chown www:www /www/wwwlogs/php_error.log和chmod 644 /www/wwwlogs/php_error.log - 如果已存在但权限不对,直接跑这两条命令修复
- 注意:别漏掉父目录
/www/wwwlogs/的权限,它也必须对www用户可写(drwxr-xr-x即 755 是安全的)
Supervisor 或计划任务里没指定 PHP 路径导致日志写到 CLI 默认位置
用 Supervisor 跑队列、或宝塔计划任务执行 php artisan 命令时,如果没写绝对路径,系统调用的是 CLI 版 PHP,而它的 error_log 默认指向 /dev/stderr 或终端,根本不会写进你的 /www/wwwlogs/ 目录。
实操建议:
- Supervisor 配置里,确保
command使用完整路径,例如:/www/server/php/84/bin/php /www/wwwroot/example.com/artisan queue:work - 宝塔计划任务中,不要只写
php artisan schedule:run,要写成/www/server/php/84/bin/php /www/wwwroot/example.com/artisan schedule:run - 验证方式:在任务脚本开头加一句
php -i | grep error_log,看输出的路径是不是你期望的那个
Monolog 审计日志没刷缓冲或 handler 被复用
用 Monolog 写审计日志时,如果没显式调用 $logger->flush(),或者把同一个 StreamHandler 实例重复绑定给多个 logger,会导致日志滞留在内存缓冲区,或者被覆盖、丢弃。
实操建议:
- 每次写完关键审计事件后,加一行
$auditLogger->flush();强制刷出 - 确保每个
Logger实例都配独立的StreamHandler,不要共用;尤其避免在循环里反复 new 同一个 handler - 检查
StreamHandler构造时第二个参数,如果是Logger::DEBUG,但你只记录INFO级别,那日志会被过滤掉——设成Logger::INFO更稳妥 - 测试时,在写日志后立即
file_get_contents('/var/log/myapp/audit.log')看内容是否实时出现
ls -l、tail -f、php -i 实锤验证,不能只信配置文件里的文字。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











