ThinkPHP6线上日志不落盘主因是APP_DEBUG=true或runtime/log/不可写:需确保APP_DEBUG=false、runtime/log目录存在且Web用户可写、config/log.php中path为空或正确、close=false、ignore_404和exception.log均为true。

ThinkPHP6 默认开启日志功能,但线上环境日志不写入文件,90% 是因为 APP_DEBUG=true 或 runtime/log/ 目录不可写,不是配置没填全。
确保 APP_DEBUG 关闭
日志写入只在生产模式(APP_DEBUG=false)下生效:
- Fatal error、Parse error 等致命错误,仅当
APP_DEBUG === false时才由 ThinkPHP 的 shutdown handler 捕获并记录 -
APP_DEBUG=true时,错误直接渲染到页面,runtime/log/几乎为空 - .env 文件中必须写成
APP_DEBUG=false(无空格、无引号),Web 服务器(如 Nginx)需显式透传该环境变量
检查 runtime/log 目录权限与存在性
日志写入失败最常见的原因是路径问题:
- 确认
runtime/目录存在,且 Web 进程用户(如 www-data、nginx、IIS_IUSRS)有写权限:chmod -R 755 runtime/(Linux) -
runtime/log/子目录可能被 CI/CD 脚本清空或被 .gitignore 忽略,部署后需手动重建 - 不要在
channels.file.path中写动态路径(如log/{date('Ym')}/error.log),ThinkPHP 不自动创建多级目录,会静默失败
核对 config/log.php 关键配置项
真正影响日志落盘的不是 level,而是以下三项:
立即学习“PHP免费学习笔记(深入)”;
-
'path' => '':表示使用默认路径runtime/log/;若想固定为runtime/log/error.log,应设为'path' => 'log/error.log'(注意是相对于runtime/) -
'close' => false:必须为false,否则全局禁用日志 -
'single' => true:可避免按日期分文件,方便监控读取,但要确保目标文件可写
确认 404 等 HTTP 异常是否记录
404 属于 HttpException,不走 PHP 错误流程,是否记录取决于:
-
config/log.php中'ignore_404' => false(默认即为 false,但有人误改为 true) -
config/exception.php中'log' => true(控制所有未捕获异常是否写日志) - 若使用自定义异常处理器,务必调用
parent::report($exception),否则日志链路中断



















