ThinkPHP 6.0 默认不聚合日志,但可通过四种方式在请求结束前获取本次请求所有日志:1. 使用 Log::getLog('trace') 获取 trace 通道内存日志;2. 配置 memory 日志驱动并调用 Log::getLog() 获取全部通道日志;3. 通过 Log::listen() 监听并手动收集;4. 注意日志级别、生命周期及生产环境限制。

ThinkPHP 6.0 默认不会将本次请求的所有日志内容“集中返回”或“缓存供读取”,日志是按级别和通道异步写入(如文件、console、trace 等),不自动聚合到内存变量中。但你可以通过以下方式**在请求结束前获取本次请求已记录的所有日志内容**(主要适用于调试、日志捕获上报等场景):
1. 使用内置的 Trace 日志通道 + 自定义日志处理器
Trace 通道默认启用,且日志会暂存在内存中(用于调试面板),可通过 think\facade\Log 获取其缓冲内容:
- 确保配置
log.trace = true(默认开启) - 在控制器/中间件末尾调用:
use think\facade\Log;<br>Log::getLog('trace'); // 返回本次请求 trace 通道所有日志数组
返回类似:[['info', 'User logged in', '2024-05-20 10:30:01'], ...] - 注意:该方法只获取
trace通道日志,不包含error、sql等其他通道内容
2. 替换日志驱动为内存驱动(推荐用于开发/测试)
修改 config/log.php,将默认驱动设为 memory,并启用多通道收集:
- 配置示例:
'default' => 'memory',<br>'channels' => [<br> 'memory' => [<br> 'type' => 'memory',<br> 'levels' => ['*'],<br> ],<br>]
- 之后任意位置调用:
Log::getLog(); // 获取全部通道所有日志<br>// 或指定通道:<br>Log::getLog('memory'); - 优点:可捕获 error、sql、info 等所有级别日志;缺点:生产环境慎用(无持久化)
3. 手动拦截并收集日志(高级定制)
通过自定义日志处理器(think\log\driver\Driver 子类)或使用 Log::listen() 事件监听器,在每次写日志时追加到全局数组:
立即学习“PHP免费学习笔记(深入)”;
- 在
app/common.php或中间件中注册监听:Log::listen(function($level, $message, $context) {<br> static $allLogs = [];<br> $allLogs[] = compact('level', 'message', 'context');<br> $GLOBALS['_REQUEST_LOGS'] = $allLogs; // 或存入 Request 对象<br>}); - 请求结束前读取:
$logs = $GLOBALS['_REQUEST_LOGS'] ?? []; - 适合需要结构化处理、过滤或实时分析日志的场景
4. 注意事项
- 日志内容受
log.level配置影响(如设为warning,则 info 日志不会记录) -
Log::getLog()只能获取当前请求生命周期内已写入的日志,不能回溯中间件之前或响应发送后的日志 - 生产环境建议用文件驱动 + 定时采集(如 inotifywait + tail),而非内存收集
- SQL 日志需开启
db.deploy.sql_log = true,且属于数据库日志,不一定进入主日志通道



















