8.2 KiB
8.2 KiB
日志模块实现总结
实现概述
本次优化完善了后端日志模块,实现了自动化的请求日志记录功能,所有后台管理 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)
使用示例
后端使用
中间件会自动记录所有请求,无需手动调用:
// 任何经过 log.request 中间件的请求都会被自动记录
Route::middleware(['auth.check:admin', 'log.request'])->group(function () {
Route::apiResource('users', UserController::class);
// 其他路由...
});
前端调用示例
// 获取日志列表
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
})
日志记录示例
成功请求日志
{
"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"
}
失败请求日志
{
"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 任务调度器,自动清理指定天数前的日志:
// app/Console/Kernel.php
$schedule->call(function () {
app(LogService::class)->clearLogs(90);
})->dailyAt('02:00');
5. 日志级别
增加日志级别(info、warning、error、critical),便于分类管理。
测试建议
功能测试
- 测试各种请求是否被正确记录
- 测试敏感信息是否被正确过滤
- 测试日志查询和筛选功能
- 测试日志导出功能
- 测试批量删除和清理功能
性能测试
- 测试日志记录对响应时间的影响
- 测试大量日志数据的查询性能
- 测试并发写入的性能
边界测试
- 测试异常情况下的日志记录
- 测试超长参数的处理
- 测试特殊字符的处理
文件清单
新增文件
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 请求都会被自动记录,管理员可以通过日志管理功能进行系统监控、审计和问题排查。