概述
日志模块负责记录系统运行过程中的关键操作和请求轨迹,帮助团队快速定位问题、追溯操作历史。模块包含两大核心部分:
| 模块 | 数据来源 | 说明 |
|---|---|---|
| 操作日志 | 前端上报 | 用户在前端执行关键操作后,前端主动调用接口上报操作记录 |
| 系统审计日志 | 后端自动记录 | 中间件自动拦截所有/api/请求,记录完整的请求/响应审计轨迹,前端只读 |
统一约定
- 所有接口需在 Header 中携带
Authorization: Bearer <token>- 所有接口统一返回格式:
{ code, message, logId, data }code = 0表示成功- 基础地址:开发环境
http://localhost:8000
一、操作日志(前端上报)
操作日志用于记录用户在前端执行的关键操作。user字段由后端通过 JWT 自动注入,前端无需手动传递。
1.1 上报操作日志(新增)
POST /api/operation-logs/请求参数(JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| action | string | ✅ | 操作类型,可选值见下方action 枚举 |
| module | string | ✅ | 操作模块,如用户管理、部门管理、角色管理 |
| target_id | string | 操作对象的 ID | |
| target_name | string | 操作对象的名称 | |
| request_method | string | HTTP 方法:GET/POST/PUT/DELETE | |
| request_url | string | 操作的 API 路径,如/api/members/42/ | |
| request_params | string | 请求参数,JSON 字符串(注意对敏感字段进行脱敏处理) | |
| ip_address | string | 客户端 IP 地址 | |
| address | string | IP 解析后的地理位置,如中国河南省信阳市 | |
| user_agent | string | 浏览器 User-Agent | |
| browser | string | 浏览器信息,如Chrome 120 | |
| os | string | 操作系统,如Windows 10 | |
| device | string | 设备类型:PC/Mobile/Tablet | |
| duration_ms | int | 操作耗时,单位毫秒 | |
| result | string | 操作结果:success(默认)/failed | |
| error_message | string | 失败时的错误描述 | |
| remark | string | 备注信息 | |
| log_id | string | 请求追踪 ID,与 API 响应中的logId相对应 |
请求示例
{"action":"update","module":"部门管理","target_name":"研发组","request_method":"PUT","request_url":"/api/departments/5/","ip_address":"187.68.233.93","address":"中国河南省信阳市","browser":"Edge 151","os":"Windows 10","device":"PC","duration_ms":128,"result":"success","log_id":"a1b2c3d4e5f6g7h8"}返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"创建成功" |
| logId | string | 追踪 ID |
| data | object | 创建的操作日志对象(完整字段见下方 1.2 列表项) |
1.2 分页查询列表(查询)
GET /api/operation-logs/请求参数(Query String)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| search | string | 模糊搜索:用户名 / 账号 / 模块名 / 对象名称 | |
| action | string | 按操作类型过滤 | |
| module | string | 按模块名模糊过滤 | |
| result | string | 操作结果:success/failed | |
| ip_address | string | IP 地址模糊搜索 | |
| start_time | string | 开始时间,格式2026-08-01T00:00:00 | |
| end_time | string | 结束时间,格式2026-08-07T23:59:59 | |
| page | int | 页码,默认1 | |
| page_size | int | 每页条数 | |
| ordering | string | 排序字段,如-created_at(降序)、duration_ms(升序) |
请求示例
GET /api/operation-logs/?search=张三&action=update&page=1&page_size=20&ordering=-created_at返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| data.count | int | 总条数 |
| data.next | string | 下一页 URL(为null时表示最后一页) |
| data.previous | string | 上一页 URL(为null时表示第一页) |
| data.results | array | 操作日志列表 |
data.results[]中每条记录的结构:
| 参数 | 类型 | 说明 |
|---|---|---|
| id | int | 日志 ID |
| log_id | string | 追踪 ID |
| user_info | object | 操作人信息:{ id, name } |
| action | string | 操作类型 |
| module | string | 操作模块 |
| target_id | string | 操作对象 ID |
| target_name | string | 操作对象名称 |
| request_method | string | HTTP 方法 |
| request_url | string | 请求路径 |
| request_params | string | 请求参数 JSON |
| ip_address | string | IP 地址 |
| address | string | 操作地点 |
| browser | string | 浏览器 |
| os | string | 操作系统 |
| device | string | 设备类型 |
| duration_ms | int | 耗时(毫秒) |
| result | string | 操作结果:success/failed |
| error_message | string | 错误信息 |
| remark | string | 备注 |
| created_by_info | object | 创建人信息:{ id, name } |
| created_at | string | 创建时间 |
| updated_at | string | 更新时间 |
返回示例
{"code":0,"message":"success","logId":"c3d4e5f6g7h8i9j0","data":{"count":150,"next":"http://localhost:8000/api/operation-logs/?page=2","previous":null,"results":[{"id":1,"log_id":"a1b2c3d4e5f6g7h8","user_info":{"id":1,"name":"管理员"},"action":"update","module":"部门管理","target_id":"5","target_name":"研发组","request_method":"PUT","request_url":"/api/departments/5/","request_params":"{\"name\":\"研发组\"}","ip_address":"187.68.233.93","address":"中国河南省信阳市","browser":"Edge 151","os":"Windows 10","device":"PC","duration_ms":128,"result":"success","error_message":"","remark":"","created_by_info":{"id":1,"name":"管理员"},"created_at":"2026-08-07T10:30:00Z","updated_at":"2026-08-07T10:30:00Z"}]}}1.3 查看详情(查询)
GET /api/operation-logs/{id}/请求参数(路径参数)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | ✅ | 日志 ID |
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| data.result | object | 单条操作日志对象(字段结构同 1.2 列表项) |
1.4 软删除(删除)
DELETE /api/operation-logs/{id}/软删除仅标记记录为已删除,不会从数据库中物理移除。
请求参数(路径参数)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | ✅ | 日志 ID |
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"删除成功" |
| data | null |
1.5 批量删除(删除)
POST /api/operation-logs/batch-delete/请求参数(JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | int[] | ✅ | 要删除的日志 ID 数组 |
请求示例
{"ids":[1,2,3]}返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"成功删除 3 条操作日志" |
| data | null |
1.6 清空全部(删除)
DELETE /api/operation-logs/clear/⚠️注意:此操作会清空所有操作日志数据,请谨慎使用。
请求参数无
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"已清空全部操作日志(共 N 条)" |
| data | null |
1.7 今日统计(查询)
GET /api/operation-logs/stats/today/请求参数无
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| data.total | int | 今日操作总数 |
| data.success | int | 成功数 |
| data.failed | int | 失败数 |
| data.by_action | object | 按操作类型分组统计,如{ "create": 10, "update": 15 } |
操作日志 — action 枚举
| 值 | 说明 | 前端触发场景 |
|---|---|---|
create | 新增 | 提交"新建"成功后 |
update | 修改 | 提交"保存"成功后 |
delete | 删除 | 确认删除成功后 |
query | 查询 | 执行搜索/筛选后(高频操作可酌情跳过) |
login | 登录 | 登录成功后(后端已自动记录,前端可选上报) |
logout | 登出 | 主动退出登录 |
export | 导出 | 导出 Excel/PDF 成功后 |
import | 导入 | 导入数据成功后 |
other | 其他 | 不归类的操作 |
二、系统审计日志(后端自动记录)
系统审计日志由后端中间件自动记录,覆盖所有/api/请求的完整请求和响应。前端仅允许查询和删除,不允许新增和修改。
每条日志会记录以下完整信息:
- 请求端:HTTP 方法、路径、所属模块、查询参数、请求头(
Authorization已脱敏)、请求体 - 响应端:HTTP 状态码、业务码、响应消息、响应头(
Set-Cookie已隐藏)、响应体 - 环境信息:客户端 IP、地理位置(IP 自动解析)、浏览器、操作系统、设备类型、耗时
- 操作人:通过 JWT 自动识别
2.1 分页查询列表(查询)
GET /api/system-logs/请求参数(Query String)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| search | string | 模糊搜索:用户名 / 账号 / 请求路径 / 模块名 | |
| request_method | string | 请求方法过滤:GET/POST/PUT/DELETE/PATCH | |
| request_path | string | 请求路径模糊搜索 | |
| module | string | 按模块名模糊过滤 | |
| response_status | int | HTTP 状态码,如200、400、403、500 | |
| response_code | int | 业务状态码,如0、10200 | |
| ip_address | string | IP 地址模糊搜索 | |
| start_time | string | 开始时间,格式2026-08-01T00:00:00 | |
| end_time | string | 结束时间,格式2026-08-07T23:59:59 | |
| page | int | 页码,默认1 | |
| page_size | int | 每页条数 | |
| ordering | string | 排序字段,如-duration_ms、-created_at |
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| data.count | int | 总条数 |
| data.next | string | 下一页 URL |
| data.previous | string | 上一页 URL |
| data.results | array | 系统日志列表 |
data.results[]中每条记录的结构:
| 参数 | 类型 | 说明 |
|---|---|---|
| id | int | 日志 ID |
| log_id | string | 追踪 ID(与该次 API 响应中的logId一致) |
| user_info | object / null | 操作人信息:{ id, name },未登录时为null |
| request_method | string | HTTP 方法 |
| request_path | string | 请求路径 |
| module | string | 所属模块,如系统监控>系统日志 |
| query_params | string | URL 查询参数 |
| request_headers | string | 请求头(JSON,Authorization已脱敏) |
| request_body | string | 请求体(最多 4096 字符) |
| response_status | int | HTTP 状态码 |
| response_code | int | 业务状态码 |
| response_message | string | 业务响应消息 |
| response_headers | string | 响应头(JSON,Set-Cookie已隐藏) |
| response_body | string | 响应体(最多 4096 字符) |
| ip_address | string | 客户端 IP |
| address | string | IP 解析后的地理位置,如中国 河南省 信阳市 |
| user_agent | string | 浏览器 User-Agent 原文 |
| browser | string | 浏览器 |
| os | string | 操作系统 |
| device | string | 设备类型 |
| duration_ms | int | 请求耗时(毫秒) |
| exception_info | string | 异常信息(正常为空) |
| created_by_info | object | 操作人信息:{ id, name } |
| created_at | string | 请求时间 |
返回示例
{"code":0,"message":"success","logId":"g7h8i9j0k1l2m3n4","data":{"count":1520,"next":"http://localhost:8000/api/system-logs/?page=2","previous":null,"results":[{"id":1,"log_id":"a1b2c3d4e5f6g7h8","user_info":{"id":1,"name":"管理员"},"request_method":"POST","request_path":"/api/members/","module":"成员管理","query_params":"","request_headers":"{\"HTTP_CONTENT_TYPE\":\"application/json\",\"HTTP_AUTHORIZATION\":\"Bearer eyJhbGc...\",\"HTTP_ORIGIN\":\"http://localhost:5173\"}","request_body":"{\"name\":\"李四\",\"email\":\"lisi@example.com\"}","response_status":201,"response_code":0,"response_message":"创建成功","response_headers":"{\"Content-Type\":\"application/json\",\"Allow\":\"GET, POST, HEAD, OPTIONS\"}","response_body":"{\"code\":0,\"message\":\"创建成功\",\"logId\":\"a1b2c3d4e5f6g7h8\",\"data\":{\"id\":42,\"name\":\"李四\"}}","ip_address":"192.168.1.100","address":"内网","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...","browser":"Chrome 120","os":"Windows 10","device":"PC","duration_ms":156,"exception_info":"","created_by_info":{"id":1,"name":"管理员"},"created_at":"2026-08-07T10:30:00Z"}]}}2.2 查看详情(查询)
GET /api/system-logs/{id}/请求参数(路径参数)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | ✅ | 日志 ID |
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| data.result | object | 单条系统日志对象(字段结构同 2.1 列表项) |
2.3 软删除(删除)
DELETE /api/system-logs/{id}/软删除仅标记记录为已删除,不会从数据库中物理移除。
请求参数(路径参数)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | ✅ | 日志 ID |
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"删除成功" |
| data | null |
2.4 批量删除(删除)
POST /api/system-logs/batch-delete/请求参数(JSON Body)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | int[] | ✅ | 要删除的日志 ID 数组 |
请求示例
{"ids":[1,2,3]}返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"成功删除 3 条系统日志" |
| data | null |
2.5 清空全部(删除)
DELETE /api/system-logs/clear/⚠️注意:此操作会清空所有系统审计日志,请谨慎使用。
请求参数无
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 0表示成功 |
| message | string | 提示信息,如"已清空全部系统日志(共 N 条)" |
| data | null |
2.6 今日请求统计(查询)
GET /api/system-logs/stats/today/请求参数无
返回参数(JSON)
| 参数 | 类型 | 说明 |
|---|---|---|
| data.total | int | 今日请求总数 |
| data.success | int | 成功数(HTTP 状态码 < 400) |
| data.failed | int | 失败数(HTTP 状态码 ≥ 400) |
| data.avg_duration_ms | float | 平均耗时(毫秒) |
三、附录
统一响应格式
所有接口均返回以下标准结构:
{"code":0,"message":"success","logId":"16位追踪ID","data":{}}常见错误码
| code | 说明 |
|---|---|
0 | 成功 |
10000 | 服务器异常 |
10001 | 数据校验失败 |
10002 | 参数错误 |
10100 | 认证失败 |
10101 | Token 已过期 |
10102 | Token 无效 |
10200 | 无操作权限 |
10300 | 数据不存在 |
50000 | 服务器内部错误 |
认证方式
所有接口需在 Header 中携带 JWT Token:
Authorization: Bearer <登录返回的 token>系统日志请求头采集说明
后端中间件会采集以下请求头信息:
| 采集的头 | 说明 |
|---|---|
HTTP_CONTENT_TYPE | 请求内容类型 |
HTTP_ACCEPT | 客户端接受的格式 |
HTTP_ORIGIN | 来源域名 |
HTTP_REFERER | 来源页面 |
HTTP_AUTHORIZATION | Token(已脱敏,仅保留前 20 字符 +...) |
HTTP_X_FORWARDED_FOR | 代理转发的真实 IP |
HTTP_X_REQUESTED_WITH | AJAX 请求标记 |
HTTP_HOST | 目标主机 |
系统日志响应头采集说明
- 采集
Content-Type、Allow、Content-Length等所有响应头 Set-Cookie已做安全处理,显示为(已隐藏)
关联查询
系统审计日志中的log_id与 API 响应中的logId保持一致。前端在捕获 API 响应中的logId后,可在上报操作日志时携带该字段,从而实现操作日志 ↔ 系统审计日志 ↔ API 响应三端串联,方便进行全链路问题排查。