ThinkPHP6接口日志需通过中间件捕获请求响应、配置独立日志通道、结构化记录关键字段,并支持开关控制与异步写入以平衡性能。

ThinkPHP6 的接口日志记录功能,核心在于拦截请求与响应过程,提取关键信息并持久化。默认日志组件不区分接口类型,需结合中间件、日志通道和自定义处理器来实现结构化、可筛选的接口日志。
使用中间件统一捕获接口请求与响应
在 app/middleware/ApiLogMiddleware.php 中编写中间件,利用 TP6 的 Request/Response 对象获取完整上下文:
- 在 before 阶段记录请求时间、URI、方法、IP、请求头(如 token)、请求体(注意避免记录敏感字段或大文件)
- 在 after 阶段补充响应状态码、耗时、响应大小、是否异常等信息
- 用 Request::hasFile() 判断是否为文件上传,跳过 body 记录防止日志膨胀
- 对 POST/PUT 的 JSON 请求,用 $request->param() 获取解析后数据;表单则用 $request->post()
配置独立日志通道专用于接口日志
在 config/log.php 中新增通道,避免与系统日志混杂:
- 设置 'channel' => 'api',驱动为 file 或 think(支持按日期分文件)
- 指定 'path' => runtime_path('log/api/'),便于运维隔离归档
- 启用 'level' => ['info', 'error'],仅记录业务级接口行为,不写 debug 级噪音
结构化日志内容,支持快速检索
不直接用 Log::info() 写字符串,而是构造标准数组,由日志处理器格式化:
- 必含字段:method、uri、ip、status、cost_ms、user_id(从 token 解析)、trace_id(可集成 SkyWalking 或自生成)
- 错误时追加 exception 和 file:line,方便定位
- 日志写入前调用 json_encode($data, JSON_UNESCAPED_UNICODE),确保中文可读
按需启用与性能控制
接口日志影响性能,应提供开关机制:
- 通过配置项 'api_log.enable' => env('API_LOG_ENABLE', false) 控制全局开关
- 在中间件中用 in_array($request->action(), config('api_log.ignore')) 跳过健康检查、静态资源等非业务接口
- 高并发场景下,考虑异步写入:将日志数据推入 Swoole\Table 或 Redis 队列,由协程消费者落盘

















