Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。

在软件开发中,审计日志记录是一项非常重要的任务。它可以帮助我们跟踪数据的变化、监控用户操作以及进行故障排查。Entity Framework Core(EF Core)是一个强大的对象关系映射框架,它提供了一些方法来实现审计日志记录。

首先,让我们来了解一下为什么需要审计日志记录。在许多应用场景中,我们需要知道数据是何时被创建、修改或删除的,以及是谁进行了这些操作。这对于合规性要求、安全性审计以及数据恢复都非常重要。例如,在金融领域,审计日志可以帮助监管机构确保交易的合法性和安全性;在企业应用中,审计日志可以帮助管理员跟踪员工的操作,防止数据泄露和滥用。

接下来,我们将探讨如何使用 EF Core 实现审计日志记录。一种常见的方法是使用 EF Core 的拦截器。拦截器可以在数据库操作发生之前或之后执行自定义的逻辑。我们可以创建一个拦截器来记录数据库操作的详细信息,如操作类型、操作时间、操作的实体以及执行操作的用户。

以下是一个使用 EF Core 拦截器实现审计日志记录的示例代码:

using Microsoft.EntityFrameworkCore.Diagnostics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AuditLoggingWithEfCore
{
   
    public class AuditInterceptor : DbCommandInterceptor
    {
   
        public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
        {
   
            LogCommand(command.CommandText, eventData.Context.Database.CurrentTransaction.GetDbTransaction().Connection.Database);
            return base.ReaderExecuting(command, eventData, result);
        }

        public override ValueTask<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result, CancellationToken cancellationToken = default)
        {
   
            LogCommand(command.CommandText, eventData.Context.Database.CurrentTransaction.GetDbTransaction().Connection.Database);
            return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
        }

        public override DbCommand CommandCreated(DbCommand command, CommandEndEventData eventData, DbCommand result)
        {
   
            LogCommand(command.CommandText, eventData.Context.Database.CurrentTransaction.GetDbTransaction().Connection.Database);
            return base.CommandCreated(command, eventData, result);
        }

        public override ValueTask<DbCommand> CommandCreatedAsync(DbCommand command, CommandEndEventData eventData, DbCommand result, CancellationToken cancellationToken = default)
        {
   
            LogCommand(command.CommandText, eventData.Context.Database.CurrentTransaction.GetDbTransaction().Connection.Database);
            return base.CommandCreatedAsync(command, eventData, result, cancellationToken);
        }

        private void LogCommand(string commandText, string databaseName)
        {
   
            // 在这里记录审计日志
            Console.WriteLine($"Database: {databaseName}, Command: {commandText}");
        }
    }
}

在上述代码中,我们创建了一个名为AuditInterceptor的类,它继承自DbCommandInterceptor。这个类重写了几个方法,以便在数据库命令执行之前或之后记录审计日志。在LogCommand方法中,我们可以将审计日志记录到文件、数据库或其他存储介质中。

为了使用这个拦截器,我们需要在DbContext的构造函数中注册它:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AuditLoggingWithEfCore
{
   
    public class MyDbContext : DbContext
    {
   
        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
        {
   
            // 注册拦截器
            this.Database.GetDbConnection().AddInterceptor(new AuditInterceptor());
        }

        // 定义实体和数据库表
        public DbSet<MyEntity> MyEntities {
    get; set; }
    }
}

现在,每当我们执行数据库操作时,拦截器都会记录相应的审计日志。

除了使用拦截器,我们还可以通过在实体类中添加审计属性来实现审计日志记录。例如,我们可以在实体类中添加CreatedByCreatedDateModifiedByModifiedDate等属性,然后在保存实体时更新这些属性的值。

以下是一个示例实体类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AuditLoggingWithEfCore
{
   
    public class MyEntity
    {
   
        public int Id {
    get; set; }
        public string Name {
    get; set; }
        public string CreatedBy {
    get; set; }
        public DateTime CreatedDate {
    get; set; }
        public string ModifiedBy {
    get; set; }
        public DateTime ModifiedDate {
    get; set; }
    }
}

在保存实体时,我们可以使用ChangeTracker来获取实体的状态,并根据状态更新审计属性的值:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AuditLoggingWithEfCore
{
   
    public class MyService
    {
   
        private readonly MyDbContext _context;

        public MyService(MyDbContext context)
        {
   
            _context = context;
        }

        public async Task SaveEntity(MyEntity entity)
        {
   
            var currentUser = "CurrentUser"; // 获取当前用户

            if (_context.Entry(entity).State == EntityState.Added)
            {
   
                entity.CreatedBy = currentUser;
                entity.CreatedDate = DateTime.Now;
            }
            else if (_context.Entry(entity).State == EntityState.Modified)
            {
   
                entity.ModifiedBy = currentUser;
                entity.ModifiedDate = DateTime.Now;
            }

            await _context.SaveChangesAsync();
        }
    }
}

通过这种方式,我们可以在实体类中记录创建和修改的信息,实现审计日志记录。

总之,使用 Entity Framework Core 实现审计日志记录有多种方法。我们可以使用拦截器来记录数据库操作的详细信息,也可以在实体类中添加审计属性来记录实体的创建和修改信息。根据具体的需求和应用场景,选择合适的方法可以帮助我们更好地跟踪数据的变化和监控用户操作。希望本文对你在使用 Entity Framework Core 实现审计日志记录方面有所帮助。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
23天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
|
23天前
|
数据采集 运维 监控
|
5月前
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
351 90
|
5月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
468 117
|
3月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
310 4
|
5月前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
392 52
|
5月前
|
存储 Windows
【Azure Cloud Service】微软云服务上的日志收集方法
本文介绍了在使用微软云服务(Cloud Service Extended Support)时,如何收集日志以分析未记录在应用日志中的服务异常。由于云服务基于传统虚拟机模式,需通过远程桌面登录实例,查看IIS、Windows Event及云服务组件日志(如WindowsAzureGuestAgent)。此外,可使用CollectGuestLogs.exe工具打包日志,或通过“File Server Resource Manager”检查日志存储配额是否不足。附参考文档链接供深入学习。
165 31
|
6月前
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
274 7
数据采集监控与告警:错误重试、日志分析与自动化运维

热门文章

最新文章