如何将Audit.net生成的审计数据插入数据库?附现有实现代码
将Audit.NET审计数据插入数据库的可行性与实现方案
嘿,当然可行啦!你当前的代码已经基于Audit.EntityFramework.Core搭好了审计实体的映射基础,只需要补充几个关键配置步骤,就能顺利把审计数据写入你的数据库。下面是具体的实现细节和注意事项:
1. 确认AuditLog实体与数据库上下文配置
首先要确保你的AuditLog是符合EF Core要求的实体类,并且已经在DbContext中完成注册:
- 定义
AuditLog实体(可根据数据库需求调整属性类型):public class AuditLog { public int Id { get; set; } // 必填主键 public string AuditData { get; set; } // 存储变更记录的JSON字符串 public string EntityType { get; set; } // 被审计的实体类型名称 public string AuditAction { get; set; } // 操作类型:Add/Update/Delete等 public DateTime AuditDate { get; set; } // 审计发生时间 public string AuditUser { get; set; } // 执行操作的用户 public string TablePk { get; set; } // 被操作实体的主键值 } - 在你的DbContext中添加
DbSet<AuditLog>:public class YourDbContext : DbContext { // 其他业务实体的DbSet... public DbSet<AuditLog> AuditLogs { get; set; } // 上下文配置(连接字符串、模型构建等)... } - 执行EF Core迁移命令,创建
AuditLogs表:Add-Migration AddAuditLogsTable Update-Database
2. 调整Audit.NET配置:选择或合并日志提供程序
你当前的代码同时配置了EntityFramework数据库提供程序和本地文件日志提供程序,这会导致审计日志同时写入数据库和本地文件。根据你的需求调整:
选项1:仅将审计数据写入数据库
移除文件日志提供程序的配置,保留EF相关逻辑即可:
AuditNet.Configuration.Setup() .UseEntityFramework(_ => _ .AuditTypeMapper(t => typeof(AuditLog)) .AuditEntityAction<AuditLog>((ev, entry, entity) => { entity.AuditData = entry.ToJson(); entity.EntityType = entry.EntityType.Name; entity.AuditAction = entry.Action; entity.AuditDate = DateTime.UtcNow; // 建议用UTC时间避免时区问题 entity.AuditUser = Environment.UserName; entity.TablePk = entry.PrimaryKey.First().Value.ToString(); }) .IgnoreMatchedProperties(true)) .WithCreationPolicy(EventCreationPolicy.InsertOnStartReplaceOnEnd) .WithAction(x => x.OnScopeCreated(scope => scope.SetCustomField("ApplicationId", "People-Back Auditoria")));
选项2:同时写入数据库和文件日志
使用MultiProvider来同时启用两个日志提供程序:
AuditNet.Configuration.Setup() .UseMultiProvider(_ => _ // 数据库审计提供程序 .AddProvider(new EntityFrameworkDataProvider(_ => _ .AuditTypeMapper(t => typeof(AuditLog)) .AuditEntityAction<AuditLog>((ev, entry, entity) => { entity.AuditData = entry.ToJson(); entity.EntityType = entry.EntityType.Name; entity.AuditAction = entry.Action; entity.AuditDate = DateTime.UtcNow; entity.AuditUser = Environment.UserName; entity.TablePk = entry.PrimaryKey.First().Value.ToString(); }) .IgnoreMatchedProperties(true))) // 文件日志提供程序 .AddProvider(new FileLogProvider(config => config .FilenamePrefix("Event_") .Directory(@"C:\Users\Cristian Reche\source\repos\people-back"))) ) .WithCreationPolicy(EventCreationPolicy.InsertOnStartReplaceOnEnd) .WithAction(x => x.OnScopeCreated(scope => scope.SetCustomField("ApplicationId", "People-Back Auditoria")));
3. 验证审计数据写入逻辑
完成配置后,Audit.NET会自动在你执行EF Core的SaveChanges()或SaveChangesAsync()时:
- 捕获实体的变更记录
- 实例化
AuditLog并填充你设置的属性 - 将
AuditLog添加到DbContext - 与主实体的变更一起提交到数据库
你只需要正常运行应用,执行增删改操作,然后检查数据库的AuditLogs表,就能看到对应的审计记录了。
关键注意事项
- 复合主键处理:如果被审计实体使用复合主键,
entry.PrimaryKey.First().Value会抛出异常,需要调整逻辑将多个主键值拼接成字符串(比如用逗号分隔)。 - 时间时区:建议使用
DateTime.UtcNow存储审计时间,后续展示时再转换为本地时间,避免跨时区环境下的时间混乱。 - 权限检查:确保应用程序拥有数据库的写入权限,以及文件目录的读写权限(如果保留文件日志)。
内容的提问来源于stack exchange,提问作者Cristian Concatel
相关产品推荐
相关产品推荐

