.NET+MongoDB项目审计日志实现方案及简易替代工具咨询
.NET + MongoDB 简易审计日志方案推荐
针对你的.NET Web项目(搭配MongoDB),以下是几个低学习成本、易上手的审计日志实现方案,覆盖从原生轻量到封装好的工具:
1. MongoDB驱动原生实现(最轻量化,无额外依赖)
如果你的项目直接用MongoDB.Driver操作数据库,完全可以自己写极简的审计逻辑,不用引入复杂包:
- 第一步:定义审计日志实体
public class AuditLog { public ObjectId Id { get; set; } public string UserId { get; set; } // 操作用户ID public DateTime OperationTime { get; set; } = DateTime.UtcNow; public string OperationType { get; set; } // 比如 "Create"/"Update"/"Delete" public string CollectionName { get; set; } // 操作的集合名 public string DocumentId { get; set; } // 操作的文档ID public Dictionary<string, object> BeforeChanges { get; set; } // 修改前数据(可选) public Dictionary<string, object> AfterChanges { get; set; } // 修改后数据 }
- 第二步:写一个通用审计服务
public class AuditService { private readonly IMongoCollection<AuditLog> _auditCollection; public AuditService(IMongoClient mongoClient) { var database = mongoClient.GetDatabase("你的数据库名"); _auditCollection = database.GetCollection<AuditLog>("auditLogs"); } // 异步记录日志,不阻塞主业务 public async Task LogOperationAsync(AuditLog log) { await _auditCollection.InsertOneAsync(log); } }
- 第三步:业务代码中调用
比如更新用户后:
// 获取修改前后的用户数据 var oldUser = await _userCollection.Find(u => u.Id == userId).FirstAsync(); var updatedUser = new User { ... }; // 更新后的用户对象 // 记录审计日志 await _auditService.LogOperationAsync(new AuditLog { UserId = 当前登录用户ID, OperationType = "Update", CollectionName = "Users", DocumentId = userId.ToString(), BeforeChanges = oldUser.ToDictionary(), AfterChanges = updatedUser.ToDictionary() });
2. EF Core + MongoDB Provider 自动审计(如果用EF操作MongoDB)
如果你的项目用MongoDB.EntityFrameworkCore作为数据访问层,可以利用EF的ChangeTracker自动捕获实体变更,减少手动代码:
- 重写DbContext的
SaveChangesAsync方法:
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default) { // 获取当前登录用户ID(可以从HttpContext或注入的服务获取) var currentUserId = "当前用户ID"; // 遍历所有变更的实体 foreach (var entry in ChangeTracker.Entries()) { if (entry.State == EntityState.Added || entry.State == EntityState.Modified || entry.State == EntityState.Deleted) { var auditLog = new AuditLog { UserId = currentUserId, OperationType = entry.State.ToString(), CollectionName = entry.Metadata.GetCollectionName(), DocumentId = entry.Property("Id").CurrentValue.ToString(), BeforeChanges = entry.State == EntityState.Modified ? entry.OriginalValues.ToDictionary() : null, AfterChanges = entry.State != EntityState.Deleted ? entry.CurrentValues.ToDictionary() : null }; // 插入审计日志集合 await _auditCollection.InsertOneAsync(auditLog, cancellationToken: cancellationToken); } } return await base.SaveChangesAsync(cancellationToken); }
这样每次调用SaveChangesAsync时,会自动记录所有实体的变更日志,不用手动在业务代码里调用。
3. Audit.NET 简化配置版(针对你提到的工具,降低使用门槛)
你之前找到的Audit.NET其实可以跳过源码阅读,直接用简化配置快速上手:
- 第一步:安装NuGet包
Install-Package Audit.NET.MongoDB
- 第二步:全局配置(在Program.cs中)
Audit.Core.Configuration.Setup() .UseMongoDB(config => config .ConnectionString("你的MongoDB连接字符串") .Database("你的数据库名") .Collection("auditLogs"));
- 第三步:包裹业务操作
用AuditScope快速记录操作,自动捕获上下文:
// 记录用户更新操作 using (var scope = AuditScope.Create("UserUpdate", () => updatedUser)) { // 执行你的业务逻辑:更新用户到MongoDB await _userCollection.ReplaceOneAsync(u => u.Id == userId, updatedUser); // 可以手动添加额外字段 scope.SetCustomField("UserId", 当前登录用户ID); }
Audit.NET会自动生成包含操作时间、操作类型、前后数据的审计日志,直接存入MongoDB,不用手动构造实体。
简易实现注意事项
- 异步写入:所有审计日志的写入都用异步方法,避免阻塞主业务流程
- 索引优化:给MongoDB的
auditLogs集合添加UserId、OperationTime字段的索引,方便后续查询 - 避免冗余:如果不需要完整的前后数据,可以只记录变更的字段(比如用差异对比工具提取变化项)
内容的提问来源于stack exchange,提问作者Ömer Can Öztürk
相关产品推荐
相关产品推荐

