如何通过ThinkPHP和Session实现追踪特定用户操作并记录详细日志?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1074个文字,预计阅读时间需要5分钟。
不改动框架日志驱动,直接在写日志前手动注入用户标识最稳妥。ThinkPHP的Log::write()默认不感知Session,需自行获取、拼接。
常见错误是直接在中间件或控制器里调 Log::write('xxx'),结果日志里全是匿名操作,查不到是谁干的。
- 确保用户已登录且
session('user_id')可取(推荐用think\Session或app()->session->get('user_id')) - 不要在日志内容里硬拼字符串,用数组格式传参,避免 SQL 注入式日志污染(比如用户昵称含单引号)
- 若用
Log::record(),需在记录前调用Log::setLevel(['info', 'debug'])并确认日志等级没被过滤
示例:
Log::write([ 'user_id' => session('user_id') ?: 'guest', 'action' => 'edit_profile', 'data' => $inputData, 'ip' => request()->ip() ], 'info');
Session 失效后日志还带 user_id 吗
不会。
本文共计1074个文字,预计阅读时间需要5分钟。
不改动框架日志驱动,直接在写日志前手动注入用户标识最稳妥。ThinkPHP的Log::write()默认不感知Session,需自行获取、拼接。
常见错误是直接在中间件或控制器里调 Log::write('xxx'),结果日志里全是匿名操作,查不到是谁干的。
- 确保用户已登录且
session('user_id')可取(推荐用think\Session或app()->session->get('user_id')) - 不要在日志内容里硬拼字符串,用数组格式传参,避免 SQL 注入式日志污染(比如用户昵称含单引号)
- 若用
Log::record(),需在记录前调用Log::setLevel(['info', 'debug'])并确认日志等级没被过滤
示例:
Log::write([ 'user_id' => session('user_id') ?: 'guest', 'action' => 'edit_profile', 'data' => $inputData, 'ip' => request()->ip() ], 'info');
Session 失效后日志还带 user_id 吗
不会。

