跳到主要内容
版本:3.0.0

AuditLogger

3.0.0 页面说明

  • 3.0.0 说明:当前页已重写为 3.x 的审计日志主题页。
  • 当前组件入口: Aegis.Security.Audit

AuditLogger 用来记录业务操作留痕。它最适合放在 Service 层,把关键动作沉淀成统一的审计记录。

推荐接入路径

第一步:启用组件

{
"Components": {
"Services": [
"Security.Audit"
],
"Middlewares": []
}
}

第二步:注入 AuditLogger<T>

public class SettlementService
{
private readonly AuditLogger<SettlementService> _auditLogger;

public SettlementService(AuditLogger<SettlementService> auditLogger)
{
_auditLogger = auditLogger;
}
}

最常见的两种写法

方式一:每次显式指定操作者

await _auditLogger
.SetOperator("1", OperatorType.医生, "张三")
.SetDomain(Domain.结算单)
.SetContent(OperationType.创建, "SETTLE_001", "创建结算单", "创建结算单 SETTLE_001")
.LogAsync();

适合场景:

  • 操作者信息每次都不同
  • 控制器里临时记一笔审计

方式二:先 PreSetOperator(...)

public class SettlementService
{
private readonly AuditLogger<SettlementService> _auditLogger;

public SettlementService(AuditLogger<SettlementService> auditLogger)
{
_auditLogger = auditLogger;
_auditLogger.PreSetOperator("1", OperatorType.医生, "张三");
}

public async Task CreateAsync()
{
await _auditLogger
.SetDomain(Domain.结算单)
.SetContent(OperationType.创建, "SETTLE_001", "创建结算单", "创建结算单 SETTLE_001")
.LogAsync();
}
}

适合场景:

  • Service 中的操作者通常就是当前登录用户
  • 希望减少重复代码

什么时候要带资源标识

如果你希望后续能直接按资源查审计记录,建议用带 operationResourceId 的重载。

await _auditLogger
.SetOperator("1", OperatorType.医生, "张三")
.SetDomain(Domain.结算单)
.SetContent(OperationType.更新, "SETTLE_001", "更新结算单", "修改结算单金额")
.LogAsync();

什么时候要带变更前后数据

对于“修改类”操作,更推荐补上 SetChangeData(...)

await _auditLogger
.SetOperator("1", OperatorType.医生, "张三")
.SetDomain(Domain.结算单)
.SetContent(OperationType.更新, "SETTLE_001", "更新结算单", "修改结算单金额")
.SetChangeData("金额,状态", newData, oldData)
.LogAsync();

正式项目通常还要做什么

默认情况下,组件会把 IAuditStorage 指到控制台存储。
正式项目一般还要自己实现 IAuditStorage,把审计数据写到数据库或其他持久化介质。

services.AddScoped<IAuditStorage, AuditDatabaseStorage>();

常见问题

为什么 SetDomain(...) 直接报错

一般是因为你用了预设操作者模式,但没有先调用 PreSetOperator(...)

审计日志应该记在 Controller 还是 Service

更推荐记在 Service。
这样更贴近业务动作,也更容易长期维护。

默认存储能不能直接用于生产

不建议。
正式环境应替换成自己的持久化实现。

继续阅读