Files
laravel_swoole/docs/LOG_IMPLEMENTATION_SUMMARY.md
2026-02-08 22:38:13 +08:00

8.2 KiB
Raw Blame History

日志模块实现总结

实现概述

本次优化完善了后端日志模块,实现了自动化的请求日志记录功能,所有后台管理 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便于分类管理。

测试建议

功能测试

  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 请求都会被自动记录,管理员可以通过日志管理功能进行系统监控、审计和问题排查。