# 日志模块实现总结 ## 实现概述 本次优化完善了后端日志模块,实现了自动化的请求日志记录功能,所有后台管理 API 请求都会被自动记录到数据库中。 ## 实现内容 ### 1. 新增文件 #### 中间件 - **app/Http/Middleware/LogRequestMiddleware.php** - 自动拦截所有经过的请求 - 记录请求和响应信息 - 计算请求执行时间 - 提取用户信息和操作详情 - 自动过滤敏感参数(密码、token等) - 获取客户端真实 IP(支持代理) #### 请求验证 - **app/Http/Requests/LogRequest.php** - 统一的请求参数验证 - 支持列表查询、批量删除、清理等操作的参数验证 - 自定义错误消息 - 自动设置默认值 #### 文档 - **docs/README_LOG.md** - 完整的模块文档 - API 接口说明 - 数据库表结构 - 使用示例 - 前端集成代码 - 常见问题解答 ### 2. 修改文件 #### 控制器 - **app/Http/Controllers/System/Admin/Log.php** - 添加 `export` 方法:支持导出日志数据为 Excel - 使用 `LogRequest` 进行参数验证 - 优化响应格式 #### 服务层 - **app/Services/System/LogService.php** - 添加 `getListQuery` 方法:提供查询构建器(用于导出等场景) - 新增 `buildQuery` 方法:统一的查询构建逻辑 - 代码重构,减少重复代码 #### 路由配置 - **routes/admin.php** - 添加 `POST /admin/logs/export` 导出路由 - 在所有需要认证的路由组中应用 `log.request` 中间件 #### 中间件配置 - **bootstrap/app.php** - 注册 `log.request` 中间件别名 - 创建 `admin.log` 中间件组 ## 功能特性 ### 自动日志记录 - ✅ 所有后台管理 API 请求自动记录 - ✅ 记录用户信息(ID、用户名) - ✅ 记录请求信息(方法、URL、参数) - ✅ 记录响应信息(状态码、执行时间) - ✅ 记录客户端信息(IP、User-Agent) - ✅ 错误请求记录详细错误信息 ### 敏感信息保护 - ✅ 自动过滤密码字段 - ✅ 自动过滤 token 字段 - ✅ 自动过滤 secret 字段 - ✅ 自动过滤 key 字段 ### 日志管理功能 - ✅ 多维度查询(用户、模块、操作、状态、时间、IP) - ✅ 分页查询 - ✅ 日志详情查看 - ✅ 日志统计(总数、成功数、失败数) - ✅ 单条删除 - ✅ 批量删除 - ✅ 定期清理(按天数) - ✅ 导出为 Excel ### 性能优化 - ✅ 日志记录在请求处理后执行 - ✅ 不影响业务响应速度 - ✅ 异常处理,记录失败不影响业务 - ✅ 支持分页查询,避免一次性加载过多数据 ## API 接口列表 | 接口 | 方法 | 说明 | |------|------|------| | `/admin/logs` | GET | 获取日志列表 | | `/admin/logs/{id}` | GET | 获取日志详情 | | `/admin/logs/statistics` | GET | 获取日志统计 | | `/admin/logs/export` | POST | 导出日志(Excel) | | `/admin/logs/{id}` | DELETE | 删除单条日志 | | `/admin/logs/batch-delete` | POST | 批量删除日志 | | `/admin/logs/clear` | POST | 清理历史日志 | ## 数据库表结构 ### system_logs 表 已存在的表结构,包含以下字段: - id: 主键 - user_id: 用户 ID - username: 用户名 - module: 模块名称 - action: 操作名称 - method: 请求方法 - url: 请求 URL - ip: 客户端 IP - user_agent: 用户代理 - params: 请求参数(JSON) - result: 响应结果 - status_code: HTTP 状态码 - status: 状态(success/error) - error_message: 错误信息 - execution_time: 执行时间(毫秒) - created_at: 创建时间 - updated_at: 更新时间 ## 中间件应用范围 ### 已应用的路由 - ✅ 所有 `/admin/*` 路由(除登录接口) - ✅ 认证相关(登出、刷新、个人信息、修改密码) - ✅ 用户管理 - ✅ 角色管理 - ✅ 权限管理 - ✅ 部门管理 - ✅ 在线用户管理 - ✅ 系统配置管理 - ✅ 数据字典管理 - ✅ 任务管理 - ✅ 城市数据管理 - ✅ 文件上传管理 ### 未应用的路由 - ❌ 登录接口(`POST /admin/auth/login`) - ❌ 健康检查接口(`GET /up`) ## 使用示例 ### 后端使用 中间件会自动记录所有请求,无需手动调用: ```php // 任何经过 log.request 中间件的请求都会被自动记录 Route::middleware(['auth.check:admin', 'log.request'])->group(function () { Route::apiResource('users', UserController::class); // 其他路由... }); ``` ### 前端调用示例 ```javascript // 获取日志列表 const response = await request.get('/admin/logs', { params: { username: 'admin', module: 'users', status: 'success', page: 1, page_size: 20 } }) // 导出日志 await request.post('/admin/logs/export', { username: 'admin', status: 'error' }, { responseType: 'blob' }) // 批量删除 await request.post('/admin/logs/batch-delete', { ids: [1, 2, 3, 4, 5] }) // 清理历史日志 await request.post('/admin/logs/clear', { days: 30 }) ``` ## 日志记录示例 ### 成功请求日志 ```json { "id": 1, "user_id": 1, "username": "admin", "module": "users", "action": "创建 users", "method": "POST", "url": "http://example.com/admin/users", "ip": "192.168.1.1", "user_agent": "Mozilla/5.0...", "params": { "name": "test", "email": "test@example.com", "password": "******" }, "result": null, "status_code": 200, "status": "success", "error_message": null, "execution_time": 125, "created_at": "2024-01-01 12:00:00" } ``` ### 失败请求日志 ```json { "id": 2, "user_id": 1, "username": "admin", "module": "users", "action": "删除 users", "method": "DELETE", "url": "http://example.com/admin/users/999", "ip": "192.168.1.1", "user_agent": "Mozilla/5.0...", "params": {}, "result": "{\"code\":404,\"message\":\"用户不存在\"}", "status_code": 404, "status": "error", "error_message": "用户不存在", "execution_time": 45, "created_at": "2024-01-01 12:01:00" } ``` ## 注意事项 ### 1. 性能考虑 - 日志记录在请求处理后执行,不影响响应速度 - 大量日志会增加数据库写入压力 - 建议定期清理历史日志 ### 2. 数据安全 - 敏感信息已自动过滤 - 日志数据应妥善保管 - 建议定期备份重要日志 ### 3. 权限控制 - 日志管理接口需要相应权限 - 建议只允许管理员查看和操作日志 ### 4. 数据库优化 - 确保查询字段有索引 - 使用分页查询避免加载过多数据 - 定期清理历史日志 ## 后续优化建议 ### 1. 异步队列 考虑使用 Laravel 队列异步处理日志记录,进一步减少对响应时间的影响。 ### 2. 日志归档 实现日志归档功能,将历史日志移动到归档表或文件存储。 ### 3. 日志分析 集成日志分析工具,提供可视化仪表盘和趋势分析。 ### 4. 定时清理 配置 Laravel 任务调度器,自动清理指定天数前的日志: ```php // app/Console/Kernel.php $schedule->call(function () { app(LogService::class)->clearLogs(90); })->dailyAt('02:00'); ``` ### 5. 日志级别 增加日志级别(info、warning、error、critical),便于分类管理。 ## 测试建议 ### 功能测试 1. 测试各种请求是否被正确记录 2. 测试敏感信息是否被正确过滤 3. 测试日志查询和筛选功能 4. 测试日志导出功能 5. 测试批量删除和清理功能 ### 性能测试 1. 测试日志记录对响应时间的影响 2. 测试大量日志数据的查询性能 3. 测试并发写入的性能 ### 边界测试 1. 测试异常情况下的日志记录 2. 测试超长参数的处理 3. 测试特殊字符的处理 ## 文件清单 ### 新增文件 ``` app/Http/Middleware/LogRequestMiddleware.php app/Http/Requests/LogRequest.php docs/README_LOG.md docs/LOG_IMPLEMENTATION_SUMMARY.md ``` ### 修改文件 ``` app/Http/Controllers/System/Admin/Log.php app/Services/System/LogService.php routes/admin.php bootstrap/app.php ``` ## 总结 本次日志模块优化完善实现了: - ✅ 全自动化的请求日志记录 - ✅ 完善的日志管理功能 - ✅ 敏感信息保护 - ✅ 多维度查询和筛选 - ✅ 数据导出功能 - ✅ 批量操作支持 - ✅ 完整的文档说明 日志模块现已完全集成到项目中,所有后台管理 API 请求都会被自动记录,管理员可以通过日志管理功能进行系统监控、审计和问题排查。