ThinkPHP6日志写不进文件,90%因APP_DEBUG=true或runtime/log/不可写:APP_DEBUG必须为false才能触发日志写入,且runtime/log目录须存在、可写、权限正确,否则即使level等配置完整也静默失败。

ThinkPHP6 日志写不进文件,90% 不是配置漏项,而是两个硬性条件没满足:APP_DEBUG 必须为 false,且 runtime/log/ 目录必须存在且可写。其他配置(比如 level、format)再全,这两个卡住就完全静默失败。
确认 APP_DEBUG 已关闭
线上环境必须设为 false,否则错误直接输出到页面,日志系统根本不会启动:
- .env 文件中写成 APP_DEBUG=false(不能带空格、不能加引号)
- Nginx/Apache 要确保该环境变量被透传(尤其用 PHP-FPM 时,需在 pool 配置里显式设置 env[APP_DEBUG] = false)
- 别信 var_dump(config('app.debug'))——它可能读的是缓存,用 php -r "echo getenv('APP_DEBUG'); " 直接查真实值
检查 runtime/log 目录权限和存在性
ThinkPHP 默认把日志写到 runtime/log/ 下,但这个目录不会自动创建,也常被部署脚本清空或忽略:
- 手动执行
mkdir -p runtime/log确保路径存在 - 运行
php -r "var_dump(is_writable('runtime/log'));"验证可写性 - Linux 下给 Web 用户(如 www-data)赋权:
chown -R www-data:www-data runtime+chmod -R 755 runtime - 检查是否被 .gitignore 或 CI/CD 流水线删掉(常见于 Docker 构建后清空 runtime)
核对 log.php 中关键路径配置
很多人改了 level 却无效,其实是 path 没配对:
-
'path' => ''表示用默认路径(即 runtime/log/),但该路径必须已存在且可写 - 想固定写到
runtime/log/error.log,应设为'path' => 'log/error.log'(注意:是相对于 runtime/ 的相对路径) - 别写动态路径如
'path' => 'log/'.date('Ym').'/error.log'—— ThinkPHP 不自动创建多级目录,会静默失败 - 确认
'close' => false(全局禁用日志的开关,务必关掉)
404 和致命错误为啥不进日志?
它们走的不是普通 Log::error() 流程:
- Fatal error / Parse error:由 PHP 的 register_shutdown_function 捕获,但 TP6 只在 APP_DEBUG === false 时才注册该钩子
-
HTTP 404:属于 HttpException,是否记录取决于两个开关:
config/log.php中'ignore_404' => false(默认就是 false),以及config/exception.php中'log' => true - 用了自定义异常处理器,必须调用
parent::report($exception),否则日志链路中断
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











