在ThinkPHP6中记录POST表单提交日志最推荐通过中间件实现,需判断Content-Type为application/x-www-form-urlencoded或multipart/form-data,过滤JSON请求及password等敏感字段并脱敏,使用Log::info记录含时间、IP、URL、User-Agent的结构化日志。

在 ThinkPHP6 中记录 POST 表单提交日志,最常用且推荐的方式是通过中间件(Middleware)统一拦截和记录,避免在每个控制器方法里重复写日志逻辑。关键点在于:只记录真实表单提交(application/x-www-form-urlencoded 或 multipart/form-data),过滤掉 API 接口、AJAX 的 JSON 提交,以及敏感字段(如密码)。
使用全局中间件捕获 POST 数据
创建一个日志中间件,用于在请求进入控制器前读取并记录 POST 内容:
- 运行命令生成中间件:
php think make:middleware LogPostData - 在
app/middleware/LogPostData.php中编写逻辑,判断是否为表单提交,并记录到日志文件 - 注意:不能直接用
$request->post()多次读取原始输入流,需用$request->input()或$request->rawInput()配合 Content-Type 判断
区分表单提交与 JSON 请求
POST 请求可能是表单、JSON、XML 等格式,日志应只记录表单类请求:
- 检查请求头:
$contentType = $request->header('content-type'); - 匹配表单类型:
stripos($contentType, 'application/x-www-form-urlencoded') !== false或stripos($contentType, 'multipart/form-data') !== false - 跳过
application/json类型,避免把接口调用误记为表单日志
安全记录:过滤敏感字段
用户密码、身份证号、手机号等字段不应明文落库或写入日志:
立即学习“PHP免费学习笔记(深入)”;
- 定义需脱敏的字段名数组,例如:
$sensitiveFields = ['password', 'pwd', 'id_card', 'mobile']; - 对
$request->post()结果遍历,命中字段则替换为*** - 使用
think\facade\Log::info()记录脱敏后的数据,支持自动按日期分文件
启用中间件并配置生效范围
让中间件只作用于需要记录的路由,而非全部请求:
- 在
app/middleware.php中注册中间件别名,例如:'log_post' => \app\middleware\LogPostData::class - 在路由定义中局部启用:
Route::post('submit', 'Index/submit')->middleware('log_post'); - 或在控制器的
initialize()中手动调用(不推荐,耦合高)
不复杂但容易忽略的是:确保中间件在 AppInit 后执行,且不要在日志中记录 $_FILES 原始内容(体积大、无意义),只需记录是否有附件上传即可。日志内容建议包含时间、IP、URL、脱敏 POST 数据、User-Agent,便于后续排查。



















