Audit.NET:是否有仅输出变更值的配置选项?
Audit.NET 仅记录变更值的配置方法
当然有办法实现仅输出变更值,Audit.NET提供了内置配置项和扩展机制来处理这种场景,以下是两种常用的实现方案:
1. EF场景:启用内置差异记录
如果你的审计是针对Entity Framework实体,可以直接在Audit.EntityFramework的配置中开启IncludeDifferences选项,它会自动对比实体的新旧值,只保留有变更的字段:
Audit.Core.Configuration.Setup() .UseEntityFramework(options => options .AuditTypeMapper(type => typeof(AuditLog)) .AuditEntityAction<AuditLog>((auditEvent, entityEntry, auditEntity) => { // 这里可以添加审计日志的额外赋值逻辑 }) .IncludeDifferences()); // 关键配置:仅记录变更字段
开启后,审计日志中会自动生成Differences字段,仅包含值发生变化的属性及其新旧值,原有的完整新旧对象可以选择保留或移除(根据你的需求)。
2. 通用场景:自定义差异过滤
如果是普通对象的审计,或者需要更精细的对比控制,可以通过两种方式实现:
方式一:全局配置值比较器
通过全局设置ValueComparer,让Audit.NET自动判断哪些值需要记录:
Audit.Core.Configuration.Setup() .UseFileLogProvider() // 替换为你实际使用的日志提供器 .SetValueComparer((oldVal, newVal) => { // 自定义值相等判断逻辑,返回true则不记录该字段的变更 if (oldVal == null && newVal == null) return true; return oldVal?.Equals(newVal) ?? false; });
方式二:手动过滤变更字段
在创建审计事件后,手动遍历属性并筛选出变更项,替换原有的完整新旧值:
using (var scope = Audit.Core.AuditScope.Create("OperationName", () => largeObject)) { var auditEvent = scope.Event; // 获取旧值和新值对象 var oldObj = auditEvent.CustomFields["Old"]; var newObj = auditEvent.CustomFields["New"]; // 筛选出值不同的属性 var changedFields = oldObj.GetType().GetProperties() .Where(prop => !Equals(prop.GetValue(oldObj), prop.GetValue(newObj))) .ToDictionary(prop => prop.Name, prop => new { OldValue = prop.GetValue(oldObj), NewValue = prop.GetValue(newObj) }); // 替换原有字段为变更集合 auditEvent.CustomFields.Remove("Old"); auditEvent.CustomFields.Remove("New"); auditEvent.CustomFields.Add("ChangedFields", changedFields); }
大部分Audit.NET的扩展(比如针对MVC、WebApi的扩展)都可以结合上述方法实现仅记录变更值的需求,核心就是通过内置差异对比或自定义逻辑过滤未变更字段。
内容的提问来源于stack exchange,提问作者Rune
相关产品推荐
相关产品推荐

