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。
这样更贴近业务动作,也更容易长期维护。
默认存储能不能直接用于生产
不建议。
正式环境应替换成自己的持久化实现。