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 实现审计日志记录方面有所帮助。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 数据采集 JavaScript
深入理解数仓开发(一)数据技术篇之日志采集
深入理解数仓开发(一)数据技术篇之日志采集
|
2月前
|
SQL 运维 监控
SLS 数据加工全面升级,集成 SPL 语法
在系统开发、运维过程中,日志是最重要的信息之一,其最大的优点是简单直接。SLS 数据加工功能旨在解决非结构化的日志数据处理,当前全面升级,集成 SPL 语言、更强的数据处理性能、更优的使用成本。
18088 137
|
25天前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
23天前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
11天前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
67 3
|
24天前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
|
16天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
33 0
|
16天前
|
开发者 前端开发 编解码
Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
24 0
|
24天前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
18 0
|
28天前
|
Kubernetes 关系型数据库 API
实时计算 Flink版产品使用问题之连接的PG表长时间无数据写入,WAL日志持续增长,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。