在ThinkPHP6中推荐使用中间件记录请求头日志,通过Log::info写入header、URL和IP信息,并支持配置开关、debug模式控制及敏感字段过滤,日志存于runtime/log/年-月/日.log。

在 ThinkPHP6 中记录请求头(Header)日志,最直接的方式是通过中间件或全局事件监听请求,在日志中写入 request()->header() 的内容。不需要修改核心文件,也不依赖第三方扩展。
使用中间件记录 Header 日志
这是推荐方式,灵活、可控、符合框架设计规范。
- 创建中间件:
php think make:middleware LogHeaderMiddleware - 在中间件
handle()方法中获取并写入日志:
php
namespace app\middleware;
use think\Request;
use think\facade\Log;
class LogHeaderMiddleware
{
public function handle(Request $request, \Closure $next)
{
// 记录请求头(转为数组,避免对象无法序列化)
$headers = $request->header();
Log::info('Request Headers', ['headers' => $headers, 'url' => $request->url(), 'ip' => $request->ip()]);
return $next($request);
}
}
然后在 app/middleware.php 或路由/分组中注册该中间件(如全局启用):
return [
\app\middleware\LogHeaderMiddleware::class,
];
仅在特定环境或条件下记录
避免生产环境日志爆炸,建议加开关控制:
- 用配置项控制是否开启:
config('app.log_header', false) - 只在 debug 模式下记录:
if (app()->isDebug()) { ... } - 过滤敏感头字段(如 Authorization、Cookie)再记录,防止泄露凭证:
$safeHeaders = array_diff_key($request->header(), array_flip(['authorization', 'cookie', 'x-forwarded-for']));
通过事件监听统一处理(可选)
如果已有事件系统习惯,也可监听 think\RequestCreated 或自定义事件:
- 在
app/event.php中绑定事件处理器 - 在处理器里调用
Log::info()写入 header 数据 - 注意:事件方式不如中间件直观,且 request 对象需确保已初始化完成
查看日志效果
日志会出现在 runtime/log/年-月/日.log 中,类似:
[2024-05-20 14:22:33] INFO Request Headers: {"headers":{"host":"localhost","user-agent":"curl\/7.81.0","accept":"*\/*"},"url":"\/api\/test","ip":"127.0.0.1"}
不复杂但容易忽略的是 header 字段名会被自动转为小写、短横线转下划线(如 X-Real-IP → x_real_ip),记录前可用 getallheaders() 做原始比对(需注意 CLI 环境不支持)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











