ThinkPHP 8.0 日志需满足四条件才能落盘:1. APP_DEBUG=true 且 runtime/ 目录已清空;2. log.php 中 file 通道配置正确(type首字母大写、path目录存在且可写、level为小写数组);3. Web请求自动保存,CLI需手动调用 Log::save();4. 验证时需检查 runtime/log/ 月分目录下生成的 .log 文件内容。

ThinkPHP 8.0 默认不写入日志文件,光调用 Log::info() 或 Log::record() 只是暂存内存,必须同时满足几个关键条件,日志才能真正落盘。
确认 APP_DEBUG 已开启
在项目根目录 .env 文件中确保:
APP_DEBUG=true
等号两侧不能有空格。修改后务必删除整个 runtime/ 目录(不是只删子目录),否则旧缓存会干扰配置生效。可临时在控制器中加 dump(config('app.debug')) 验证是否返回 true。
检查 log.php 中的通道配置是否有效
打开 config/log.php,确认 'channels' => [] 数组里已声明至少一个可用通道,例如默认的 file 通道:
'file' => [
'type' => 'File',
'path' => runtime_path('log/'),
'level' => ['info', 'error', 'sql'], // 根据需要添加级别
'single' => false,
'max_files' => 30,
],
注意:
-
'type'必须首字母大写,写成'file'或'FILE'会导致驱动加载失败; -
'path'指向的目录(如runtime/log/)必须存在且 PHP 进程有写权限; -
'level'是小写字符串数组,['INFO']或'info,error'均无效。
确保请求正常结束或手动触发保存
Web 请求下,框架会在响应结束时自动调用 Log::save();但 CLI 命令(如定时任务)不会自动保存,需在逻辑末尾显式加上:
Log::save();
更稳妥写法是:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
try {
// 你的业务逻辑
} finally {
Log::save();
}
验证日志是否真的生成
- 清空
runtime/log/目录; - 在控制器中写测试日志:
\think\facade\Log::info('日志测试', ['timestamp' => time()]); - 访问对应路由;
- 检查
runtime/log/202610/(按月分目录)下是否有新.log文件生成,并包含你写的那条记录。
只要这四步都到位,日志就能稳定记录。缺任何一环,都会表现为“调用了但没文件、没内容”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










