ThinkPHP6开启JSON日志需在config/log.php中将日志通道的'json'设为true,并配置'json_options'避免中文转义;日志内容须可序列化,推荐传数组;可通过'processor'注入固定字段;日志文件仍存于runtime/log/年月/日.log,每行为独立JSON。

ThinkPHP6 默认日志是纯文本格式,若需输出为 JSON 格式,核心在于配置日志通道的 json 选项为 true,并确保日志内容本身结构清晰、可序列化。
开启 JSON 日志格式
在 config/log.php 的日志通道(如 file)中,将 'json' => true 启用:
- 该设置会让每条日志以标准 JSON 行(JSON Lines)形式写入,例如:
{"time":"2026-10-29T15:52:00+08:00","level":"info","msg":"用户登录成功","context":{"uid":1001}} - 同时建议开启
'json_options' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,避免中文转义和 URL 斜杠双写 -
'format'配置将被忽略,因为 JSON 模式下格式由序列化逻辑控制,不走字符串模板
确保日志内容可 JSON 序列化
调用 Log::info() 等方法时,传入的数据需为数组或标量值,不能含资源、闭包、对象(除非实现 JsonSerializable):
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- ✅ 推荐写法:
Log::info('订单创建', ['order_id' => 123, 'amount' => 99.9, 'status' => 'paid']); - ❌ 避免写法:
Log::info('DB result', $pdoStatement);(PDO 对象无法 JSON 化) - 如需记录复杂对象,先用
var_export($obj, true)或json_encode($obj, JSON_PARTIAL_OUTPUT_ON_ERROR)转为字符串再传入
自定义 JSON 日志结构(可选)
若需添加固定字段(如请求 ID、环境名),可通过 'processor' 配置项注入处理逻辑:
立即学习“PHP免费学习笔记(深入)”;
- 在
channels.file.processor中传入闭包,例如: 'processor' => function(array $record) { $record['env'] = app()->isDebug() ? 'dev' : 'prod'; $record['request_id'] = request()?->header('x-request-id') ?: uniqid('log_'); return $record; }- 该闭包会在每条日志写入前执行,修改
$record数组内容,最终被 JSON 序列化
验证与定位日志文件
启用 JSON 日志后,日志仍按默认路径存储,但内容已为合法 JSON:
- 默认位置:
runtime/log/年月/日.log(如runtime/log/202610/29.log) - 若启用了
'apart_level' => ['error', 'info'],则对应级别会分文件:如29_info.log内容全为 JSON 行 - 可用
jq -s '.' 29_info.log快速校验是否为有效 JSON 集合(注意:每行独立 JSON,非单个大 JSON 对象)


















