Yii2中通过配置专用FileTarget日志目标并设置categories为['upload'],在上传Action中用Yii::info记录文件名、大小、扩展名、用户ID、IP、控制器/动作及时间戳,成功后写入upload.log,失败时用Yii::error记录错误码,结合prefix添加用户标识与请求ID、仅POST触发、敏感字段哈希脱敏,实现完整可追溯的上传审计日志。

你需要在 Yii2 应用中对用户上传文件的操作进行完整日志记录,包括上传时间、文件名、大小、扩展名、操作用户、控制器动作,以及是否成功。不依赖第三方组件,仅用 Yii2 原生日志系统与请求上下文即可实现可追溯的上传行为审计。
配置专用上传日志 Target
打开 config/web.php(或 config/main.php,取决于项目模板),在 'components' => ['log' => [...]] 的 'targets' 数组中追加一个独立的日志目标:
['class' => 'yii\log\FileTarget', 'levels' => ['info'], 'categories' => ['upload'], 'logFile' => '@app/runtime/logs/upload.log', 'maxFileSize' => 1024 * 50, 'maxLogFiles' => 30, 'fileMode' => 0644];
注意:必须指定 【'categories' => ['upload']】,否则后续调用无法路由到该日志文件;logFile 路径中不能含日期变量(如 date('Y_m_d')),否则每次请求都会新建文件,导致日志分散不可查。
在上传控制器中注入日志逻辑
找到处理上传的核心 Action(例如 actionUpload()),在验证通过、保存文件前插入日志记录语句:
Yii::info([
'filename' => $uploadedFile->name,
'extension' => $uploadedFile->extension,
'size_bytes' => $uploadedFile->size,
'saved_as' => $savePath,
'ip' => Yii::$app->request->getUserIP(),
'user_id' => Yii::$app->user->id ?? null,
'controller' => Yii::$app->controller->id,
'action' => Yii::$app->controller->action->id,
'timestamp' => date('c')
], 'upload');
这一步必须放在 $uploadedFile->saveAs($savePath) 成功执行之后,否则 $savePath 可能未定义;若上传失败需单独记录错误日志,使用 Yii::error(..., 'upload') 并包含 $uploadedFile->error 码。
增强日志可读性与过滤能力
方法一:自定义日志前缀,让每条上传日志自动带上用户标识和请求ID
在 config/web.php 的 FileTarget 配置中添加 'prefix' 回调函数:
'prefix' => function ($message) {
$user = Yii::$app->user->identity ?? null;
$uid = $user ? $user->id : 'guest';
$reqId = Yii::$app->request->headers->get('X-Request-ID', substr(md5(uniqid()), 0, 8));
return "[$uid][$reqId]";
},
方法二:限制上传日志仅记录 POST 请求中的上传行为,避免 GET 请求误触发
在控制器中加一层判断:
if (!Yii::$app->request->isPost) {
Yii::warning('Non-POST request attempted upload', 'upload');
return $this->redirect(['site/index']);
}
方法三:对敏感字段脱敏,防止日志泄露原始文件名(如含身份证号)
记录时改用哈希截断:
'filename_hash' => substr(md5($uploadedFile->name), 0, 12),
'original_name_length' => strlen($uploadedFile->name),


















