最常见原因是 storage/logs 目录权限不足:Web 进程用户(如 www-data、nginx)无写权限,导致日志静默丢弃;runtime 目录也需可写;CLI 模式下还需单独确保该用户或配置独立路径。

ThinkPHP 6.0 日志写入失败,最常见原因不是报错,而是静默丢弃——Log::info()看着执行成功,文件却没生成、也没任何错误提示。核心问题几乎都落在 storage/logs 目录权限不对 上。
storage/logs 目录不可写,日志直接不落盘
Linux 下 Web 进程(如 www-data、nginx 或 apache)必须对 storage/logs 有写权限,否则 TP6 会跳过写入,连 warning 都不抛。
-
查看当前权限和属主:
ls -ld storage/logs ls -ld runtime
注意:
runtime目录本身也必须可写,否则连日志文件都创建不了。立即学习“PHP免费学习笔记(深入)”;
确认 PHP 实际运行用户(不是你登录的用户):
创建一个临时 PHP 文件,输出posix_getpwuid(posix_geteuid()),或查 Web 服务器配置(如 Nginx 的user指令、PHP-FPM 的user/group)。-
修复命令(根据系统选):
- Debian/Ubuntu(Web 用户通常是
www-data):sudo chown -R www-data:www-data storage
- CentOS/RHEL(Web 用户通常是
nginx或apache):sudo chown -R nginx:nginx storage # 或 sudo chown -R apache:apache storage
- Docker 环境:挂载卷时需确保宿主机目录 UID/GID 与容器内 Web 用户一致,
chown在容器内可能无效。
- Debian/Ubuntu(Web 用户通常是
CLI 模式下日志也失败?权限要单独处理
TP6 的日志配置在 Web 和 CLI 下共用一套,但 CLI 常以 root 或开发用户身份运行,和 Web 用户不同。
- 如果
php think hello写不出日志,说明storage/logs对 CLI 用户不可写。 - 解决方式二选一:
- 统一属主:把
storage设为 Web 用户,再让 CLI 也用该用户执行(如sudo -u www-data php think hello); - 或给 CLI 单独配日志路径,在
config/log.php中按环境区分:'file' => [ 'type' => 'file', 'path' => APP_ENV === 'cli' ? '/var/log/myapp-cli/' : runtime_path('log/'), ],
- 统一属主:把
其他容易被忽略的权限关联点
-
SELinux(CentOS/RHEL):即使权限正确,也可能被 SELinux 拦截。临时验证可执行:
sudo setenforce 0
若此时日志恢复,说明需调整上下文:
sudo semanage fcontext -a -t httpd_log_t "/path/to/storage/logs(/.*)?" sudo restorecon -Rv /path/to/storage/logs
宝塔/Nginx/Apache 配置:确认 Web 服务没禁用
open_basedir或限制了storage路径访问。Docker volume 挂载权限:使用
-v ./storage:/app/storage时,宿主机目录默认属主是 root,容器内 Web 用户无法写。建议在 Dockerfile 中RUN chown -R nginx:nginx /app/storage,或用:z标签(SELinux)或:Z(强制重标)。
不复杂但容易忽略。重点就三件事:确认 Web 进程用户、确保 storage 及其子目录可写、CLI 场景单独验证。



















