laravel默认不记录get参数是出于隐私保护和日志体积控制,因url常含敏感信息;安全记录方式包括控制器调试、环境限定中间件、白名单过滤处理器,需规避空数组、乱码及嵌套键问题,并严格限制生产环境日志输出。

为什么默认不记录GET参数
Laravel 的 Log::info() 或日志中间件默认只记录请求路径、方法、状态码,$_GET 或 $request->query() 不会自动进日志。这不是遗漏,是出于隐私和体积考虑:URL 参数常含敏感字段(如 token、email)、分页值、追踪 ID,全量记录既违规又易撑爆日志文件。
手动记录 GET 参数的三种安全方式
推荐按场景选一种,避免全局开启:
- 调试单个接口时,在控制器里用
Log::debug('GET params', $request->query()->all())—— 注意别在生产环境留这行,也别用info()级别 - 需临时排查某类路由(如所有
/api/*),写一个轻量中间件:public function handle($request, Closure $next) { if (app()->environment('local') && $request->isMethod('GET')) { \Log::debug('GET request', [ 'url' => $request->fullUrl(), 'query' => $request->except(['utm_source', 'ref']) // 过滤常见追踪参数 ]); } return $next($request); } - 想统一记录但规避敏感字段,改写
config/logging.php中的stack通道,配合自定义日志处理器,对request上下文做白名单过滤(如只保留page、sort、search)
容易踩的坑:日志里出现空数组或乱码
常见原因有三个:
-
$request->query()返回的是Illuminate\Http\ParameterBag,直接传给Log::debug()会触发__toString()导致空字符串 —— 必须调用->all()或->toArray() - URL 含中文或特殊符号(如
%E4%BD%A0%E5%A5%BD),Laravel 默认已解码,但若前端未正确 encode,日志里会出现乱码或截断 —— 检查前端是否用encodeURIComponent()编码 - 参数名含点号(如
filter.name)会被 Laravel 自动转成嵌套数组,但日志输出时可能被某些日志驱动(如single)序列化失败 —— 改用$request->query->all()并确保日志驱动支持 UTF-8 和深层结构
生产环境必须关掉或脱敏
上线前务必确认两件事:
- 所有
Log::debug()或显式记录 query 的代码,都被if (app()->environment('local'))包裹,或已删除 - 如果用了中间件统一记录,确保它只在
local或testing环境注册(检查AppServiceProvider::boot()或中间件配置) - 最保险的做法:在
config/logging.php里为生产环境禁用context输出,或用Monolog\Processor\PsrLogMessageProcessor剥离敏感键
真正难的不是记下参数,而是判断哪些该记、哪些该删、删到哪一层 —— 每次加日志前,先问自己:这个值会不会出现在审计报告里?











