跳转到正文

使用与配置

完成快速开始后,可以按接口控制记录内容,并通过配置限制日志大小和异步保存资源。

控制记录内容

设置模块和操作

注解属性作用默认行为
AopSystemLogModule.valueController 所属模块未声明时使用 Controller 简单类名
AopSystemLogRecord.name操作名称必填;传空白时回退到方法名
AopSystemLogRecord.code稳定操作编码未设置时使用方法签名
AopSystemLogRecord.module当前方法的模块名称未设置时沿用类级模块
AopSystemLogRecord.responseData允许记录响应 datatrue,同时受全局开关限制

关闭某个操作的响应正文采集:

java
@AopSystemLogRecord(name = "重置凭证", responseData = false)

这仍会记录操作及可提取的响应码、消息等信息。未标注方法注解的接口不采集;同一次同步 MVC 请求只提交一条日志。

采集请求参数

yaml
own:
  system-log:
    capture:
      request-params: true
      response-data: true

request-params 只读取 Servlet 已解析的 query/form 参数,不主动读取请求流,也不自动记录 @RequestBody。文件和二进制响应会省略正文。

记录内容

快照默认不按字段名脱敏,password、Token、Authorization 等可用字段也可能被保留。需要限制内容时,关闭相应采集或自定义响应提取器。快照仍尊重 @JsonIgnore,并对类型、大小和深度进行限制。

补充业务信息

在已采集的 Web 请求中,使用 SystemLogContext 补充信息。下面代码放在业务方法内:

java
SystemLogContext.current().ifPresent(context ->
        context.extra(Map.of("targetId", "1001")));

其中 SystemLogContext 位于 com.own.component.log.coreMapjava.util.Map。采集关闭或接口未标注时,current() 返回空 Optional。

登录成功后,可通过 context.authenticated("1001") 补充确认的用户 ID。它保存在 operation.authenticatedUserId 中,不覆盖操作开始时的匿名发起人。

直接写 HttpServletResponse 时,应在写出前调用 context.response(body) 补充响应。非 Web 场景可调用 SystemLogRecorder.record(SystemLog);必须提供发起人、操作开始时间和响应完成时间。默认记录器会重新应用本地采集配置及服务名。

配置参考

以下配置项均位于 own.system-log 下。

配置项默认值说明
enabledfalse本机采集和默认记录器开关
service-namespring.application.name启用采集时必须可解析
capture.request-paramsfalse采集 query/form 参数
capture.response-datatrue采集响应 data
capture.max-response-bytes1638464–16384 字节
capture.max-field-bytes204816–2048 字节
capture.max-depth51–10 层
capture.max-collection-size501–100 项
async.workers2工作线程数,至少 1
async.queue-capacity256排队容量,至少 1
async.shutdown-timeout10s关闭时等待保存完成,0–60 秒

完整记录编码超过 32 KiB 时丢弃,该上限不可通过上述配置调整。后端连接和读写超时由各保存器单独设置。

理解日志结果

原始模型为 com.own.component.log.model.SystemLog

字段内容
id原始事件 ID
operator操作开始时的身份类型、ID、名称、客户端、IP
operation模块、操作、请求信息、开始时间、登录后确认的用户 ID
responseHTTP 状态、业务 code/message、data、成功标识、完成时间
traceId / serviceName链路与来源服务
durationMillis / extra耗时与额外快照

默认响应提取器支持 ResultModel 和统一异常响应 ExceptionMessageModel。无法确认业务结果时 successnull,HTTP 错误状态会标记失败。

公共响应协议见 Base 响应与异常。当前 Base 校验失败响应使用 00003 且保留 success=true,该码又是默认提取器认可的操作成功码,因此这一分支可能被记为业务成功;需要应用统一校验错误码或适配响应提取规则。

请求、响应和扩展数据使用 JsonSnapshot,其中 json 为已编码的 JSON 文本,status 表示采集结果:

状态含义
CAPTURED已采集
OMITTED因配置或类型策略省略
TRUNCATED达到大小、深度或集合上限
UNAVAILABLE未获取、提取失败或生命周期不支持,具体原因见 reason

自定义扩展

将实现注册为 Spring Bean:

接口用途
SystemLogOperatorResolver从请求解析可信发起人
SystemLogResponseExtractor适配自定义响应结构,返回的数据仍经过快照处理
SystemLogPersistence保存完整日志,需支持并发调用
SystemLogRecorder接管记录和分发策略

前三个接口位于 com.own.component.log.spi,Recorder 位于 com.own.component.log.core

默认发起人解析使用当前会话、可用的客户端参数管理器和 remoteAddr,不直接信任 X-Forwarded-For。若身份在方法切面中才产生,需要将身份解析前移或自行适配 Resolver。

会话 Provider 与请求 TraceId 的基础行为见 Base 上下文。日志记录器使用自己的工作线程和队列,不受 Base customAsyncExecutor 容量配置控制。

默认记录器收集所有保存器,按 Ordered / @Order 顺序调用,@Primary 不会排除其他实现。单个后端异常后仍尝试其余后端;慢后端会占用当前工作线程。

异步保存的边界

record() 返回 true 只代表入队成功。内存队列不自动重试、不提供跨后端事务,进程异常退出可能丢失未完成日志。队列满时直接拒绝,不在业务线程执行保存。

AsyncSystemLogRecorder 提供实例内存计数:acceptedCount() 统计接收任务,droppedCount() 统计提交失败及关闭超时移除的排队任务,failedCount() 按后端异常次数统计。计数重启归零,且存在交叉,不能直接相加作为总提交数。

当前采集面向同步 Spring MVC。异步派发标记 ASYNC_UNSUPPORTED,流式响应、ERROR 二次派发及进入 MVC 前的 Filter 拒绝需要额外适配。日志反映服务端准备返回的内容,不保证客户端已经收到。