You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:23:14