338 lines
8.2 KiB
Markdown
338 lines
8.2 KiB
Markdown
# 日志模块实现总结
|
||
|
||
## 实现概述
|
||
|
||
本次优化完善了后端日志模块,实现了自动化的请求日志记录功能,所有后台管理 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 请求都会被自动记录,管理员可以通过日志管理功能进行系统监控、审计和问题排查。
|