ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

操作日志 + 审计日志:双维度日志系统 API 设计手册

2026/8/9 7:34:42 拓冰建站 浏览量
操作日志 + 审计日志:双维度日志系统 API 设计手册

概述

日志模块负责记录系统运行过程中的关键操作和请求轨迹,帮助团队快速定位问题、追溯操作历史。模块包含两大核心部分:

模块数据来源说明
操作日志前端上报用户在前端执行关键操作后,前端主动调用接口上报操作记录
系统审计日志后端自动记录中间件自动拦截所有/api/请求,记录完整的请求/响应审计轨迹,前端只读

统一约定

  • 所有接口需在 Header 中携带Authorization: Bearer <token>
  • 所有接口统一返回格式:{ code, message, logId, data }
  • code = 0表示成功
  • 基础地址:开发环境http://localhost:8000

一、操作日志(前端上报)

操作日志用于记录用户在前端执行的关键操作。user字段由后端通过 JWT 自动注入,前端无需手动传递。


1.1 上报操作日志(新增)

POST /api/operation-logs/

请求参数(JSON Body)

参数类型必填说明
actionstring操作类型,可选值见下方action 枚举
modulestring操作模块,如用户管理部门管理角色管理
target_idstring操作对象的 ID
target_namestring操作对象的名称
request_methodstringHTTP 方法:GET/POST/PUT/DELETE
request_urlstring操作的 API 路径,如/api/members/42/
request_paramsstring请求参数,JSON 字符串(注意对敏感字段进行脱敏处理)
ip_addressstring客户端 IP 地址
addressstringIP 解析后的地理位置,如中国河南省信阳市
user_agentstring浏览器 User-Agent
browserstring浏览器信息,如Chrome 120
osstring操作系统,如Windows 10
devicestring设备类型:PC/Mobile/Tablet
duration_msint操作耗时,单位毫秒
resultstring操作结果:success(默认)/failed
error_messagestring失败时的错误描述
remarkstring备注信息
log_idstring请求追踪 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)

参数类型说明
codeint0表示成功
messagestring提示信息,如"创建成功"
logIdstring追踪 ID
dataobject创建的操作日志对象(完整字段见下方 1.2 列表项)

1.2 分页查询列表(查询)

GET /api/operation-logs/

请求参数(Query String)

参数类型必填说明
searchstring模糊搜索:用户名 / 账号 / 模块名 / 对象名称
actionstring按操作类型过滤
modulestring按模块名模糊过滤
resultstring操作结果:success/failed
ip_addressstringIP 地址模糊搜索
start_timestring开始时间,格式2026-08-01T00:00:00
end_timestring结束时间,格式2026-08-07T23:59:59
pageint页码,默认1
page_sizeint每页条数
orderingstring排序字段,如-created_at(降序)、duration_ms(升序)

请求示例

GET /api/operation-logs/?search=张三&action=update&page=1&page_size=20&ordering=-created_at

返回参数(JSON)

参数类型说明
codeint0表示成功
data.countint总条数
data.nextstring下一页 URL(为null时表示最后一页)
data.previousstring上一页 URL(为null时表示第一页)
data.resultsarray操作日志列表

data.results[]中每条记录的结构:

参数类型说明
idint日志 ID
log_idstring追踪 ID
user_infoobject操作人信息:{ id, name }
actionstring操作类型
modulestring操作模块
target_idstring操作对象 ID
target_namestring操作对象名称
request_methodstringHTTP 方法
request_urlstring请求路径
request_paramsstring请求参数 JSON
ip_addressstringIP 地址
addressstring操作地点
browserstring浏览器
osstring操作系统
devicestring设备类型
duration_msint耗时(毫秒)
resultstring操作结果:success/failed
error_messagestring错误信息
remarkstring备注
created_by_infoobject创建人信息:{ id, name }
created_atstring创建时间
updated_atstring更新时间

返回示例

{"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}/

请求参数(路径参数)

参数类型必填说明
idint日志 ID

返回参数(JSON)

参数类型说明
codeint0表示成功
data.resultobject单条操作日志对象(字段结构同 1.2 列表项)

1.4 软删除(删除)

DELETE /api/operation-logs/{id}/

软删除仅标记记录为已删除,不会从数据库中物理移除。

请求参数(路径参数)

参数类型必填说明
idint日志 ID

返回参数(JSON)

参数类型说明
codeint0表示成功
messagestring提示信息,如"删除成功"
datanull

1.5 批量删除(删除)

POST /api/operation-logs/batch-delete/

请求参数(JSON Body)

参数类型必填说明
idsint[]要删除的日志 ID 数组

请求示例

{"ids":[1,2,3]}

返回参数(JSON)

参数类型说明
codeint0表示成功
messagestring提示信息,如"成功删除 3 条操作日志"
datanull

1.6 清空全部(删除)

DELETE /api/operation-logs/clear/

⚠️注意:此操作会清空所有操作日志数据,请谨慎使用。

请求参数

返回参数(JSON)

参数类型说明
codeint0表示成功
messagestring提示信息,如"已清空全部操作日志(共 N 条)"
datanull

1.7 今日统计(查询)

GET /api/operation-logs/stats/today/

请求参数

返回参数(JSON)

参数类型说明
data.totalint今日操作总数
data.successint成功数
data.failedint失败数
data.by_actionobject按操作类型分组统计,如{ "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)

参数类型必填说明
searchstring模糊搜索:用户名 / 账号 / 请求路径 / 模块名
request_methodstring请求方法过滤:GET/POST/PUT/DELETE/PATCH
request_pathstring请求路径模糊搜索
modulestring按模块名模糊过滤
response_statusintHTTP 状态码,如200400403500
response_codeint业务状态码,如010200
ip_addressstringIP 地址模糊搜索
start_timestring开始时间,格式2026-08-01T00:00:00
end_timestring结束时间,格式2026-08-07T23:59:59
pageint页码,默认1
page_sizeint每页条数
orderingstring排序字段,如-duration_ms-created_at

返回参数(JSON)

参数类型说明
codeint0表示成功
data.countint总条数
data.nextstring下一页 URL
data.previousstring上一页 URL
data.resultsarray系统日志列表

data.results[]中每条记录的结构:

参数类型说明
idint日志 ID
log_idstring追踪 ID(与该次 API 响应中的logId一致)
user_infoobject / null操作人信息:{ id, name },未登录时为null
request_methodstringHTTP 方法
request_pathstring请求路径
modulestring所属模块,如系统监控>系统日志
query_paramsstringURL 查询参数
request_headersstring请求头(JSON,Authorization已脱敏)
request_bodystring请求体(最多 4096 字符)
response_statusintHTTP 状态码
response_codeint业务状态码
response_messagestring业务响应消息
response_headersstring响应头(JSON,Set-Cookie已隐藏)
response_bodystring响应体(最多 4096 字符)
ip_addressstring客户端 IP
addressstringIP 解析后的地理位置,如中国 河南省 信阳市
user_agentstring浏览器 User-Agent 原文
browserstring浏览器
osstring操作系统
devicestring设备类型
duration_msint请求耗时(毫秒)
exception_infostring异常信息(正常为空)
created_by_infoobject操作人信息:{ id, name }
created_atstring请求时间

返回示例

{"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}/

请求参数(路径参数)

参数类型必填说明
idint日志 ID

返回参数(JSON)

参数类型说明
codeint0表示成功
data.resultobject单条系统日志对象(字段结构同 2.1 列表项)

2.3 软删除(删除)

DELETE /api/system-logs/{id}/

软删除仅标记记录为已删除,不会从数据库中物理移除。

请求参数(路径参数)

参数类型必填说明
idint日志 ID

返回参数(JSON)

参数类型说明
codeint0表示成功
messagestring提示信息,如"删除成功"
datanull

2.4 批量删除(删除)

POST /api/system-logs/batch-delete/

请求参数(JSON Body)

参数类型必填说明
idsint[]要删除的日志 ID 数组

请求示例

{"ids":[1,2,3]}

返回参数(JSON)

参数类型说明
codeint0表示成功
messagestring提示信息,如"成功删除 3 条系统日志"
datanull

2.5 清空全部(删除)

DELETE /api/system-logs/clear/

⚠️注意:此操作会清空所有系统审计日志,请谨慎使用。

请求参数

返回参数(JSON)

参数类型说明
codeint0表示成功
messagestring提示信息,如"已清空全部系统日志(共 N 条)"
datanull

2.6 今日请求统计(查询)

GET /api/system-logs/stats/today/

请求参数

返回参数(JSON)

参数类型说明
data.totalint今日请求总数
data.successint成功数(HTTP 状态码 < 400)
data.failedint失败数(HTTP 状态码 ≥ 400)
data.avg_duration_msfloat平均耗时(毫秒)

三、附录

统一响应格式

所有接口均返回以下标准结构:

{"code":0,"message":"success","logId":"16位追踪ID","data":{}}

常见错误码

code说明
0成功
10000服务器异常
10001数据校验失败
10002参数错误
10100认证失败
10101Token 已过期
10102Token 无效
10200无操作权限
10300数据不存在
50000服务器内部错误

认证方式

所有接口需在 Header 中携带 JWT Token:

Authorization: Bearer <登录返回的 token>

系统日志请求头采集说明

后端中间件会采集以下请求头信息:

采集的头说明
HTTP_CONTENT_TYPE请求内容类型
HTTP_ACCEPT客户端接受的格式
HTTP_ORIGIN来源域名
HTTP_REFERER来源页面
HTTP_AUTHORIZATIONToken(已脱敏,仅保留前 20 字符 +...
HTTP_X_FORWARDED_FOR代理转发的真实 IP
HTTP_X_REQUESTED_WITHAJAX 请求标记
HTTP_HOST目标主机

系统日志响应头采集说明

  • 采集Content-TypeAllowContent-Length等所有响应头
  • Set-Cookie已做安全处理,显示为(已隐藏)

关联查询

系统审计日志中的log_id与 API 响应中的logId保持一致。前端在捕获 API 响应中的logId后,可在上报操作日志时携带该字段,从而实现操作日志 ↔ 系统审计日志 ↔ API 响应三端串联,方便进行全链路问题排查。