Asp-Net-Core开发笔记:进一步实现非侵入性审计日志功能 - 程序设计实验室

Asp-Net-Core开发笔记:进一步实现非侵入性审计日志功能 - 程序设计实验室

💡 原文中文,约8500字,阅读约需21分钟。
📝

内容提要

本文介绍了如何在Asp.Net Core中实现无侵入的审计日志功能。通过在需要审计的接口上添加[AuditLog]特性,自动记录操作日志和实体变化。审计功能集中管理,使用EntityChangeInfo类保存变化信息,并通过AuditLogMiddleware生成事件ID,最终将审计日志存储在MongoDB中,包含操作类型、用户信息和实体变更记录。

🔎

延伸解读

非侵入式审计的实现机制

文章通过自定义ActionFilterAttribute(AuditLogAttribute)和ORM事件钩子,实现了对业务代码的非侵入式审计。开发者只需在接口上添加[AuditLog]特性并指定EventType,审计日志的生成、用户信息获取、实体变更记录等均由框架自动完成,无需修改业务逻辑。这种设计降低了代码耦合,便于统一管理审计功能。

实体变更监控的ORM依赖

实体变更记录依赖于ORM提供的事件机制。文章以FreeSQL为例,通过Aop.CurdBefore事件捕获CRUD操作前的SQL和参数,并存入HttpContext.Items,供AuditLogAttribute读取。这意味着若更换ORM,需要重新实现类似的事件处理器,因此该方案对ORM有一定绑定,但整体架构仍保持可扩展性。

审计日志的存储与结构

审计日志最终存储在MongoDB中,包含EventId、EventType、用户信息、IP地址、路由数据以及EntityChanges列表。EntityChanges中记录了每次数据库操作的实体名称、操作类型、SQL语句和参数,便于追溯数据变化。这种结构清晰地将操作日志与实体变更分离,方便查询和分析。

中间件与EventId的预留设计

AuditLogMiddleware为每个请求生成唯一的EventId并存入HttpContext.Items,初衷是关联实体更新与过滤器,但作者发现实际并未使用。尽管如此,这种预留设计为未来可能的扩展(如全链路追踪)提供了基础,体现了在架构上保留灵活性的思路。

❓

Q&A

如何在Asp.Net Core中实现无侵入的审计日志功能?

通过在需要审计的接口上添加[AuditLog]特性,可以自动记录操作日志和实体变化。

审计日志中包含哪些信息?

审计日志包含操作类型、用户信息、事件ID、时间戳和实体变更记录等信息。

如何管理审计功能的代码结构?

审计功能的代码应集中管理,建议将相关代码归集到一个目录中,以提高可维护性。

AuditLogAttribute类的作用是什么?

AuditLogAttribute类用于简化审计日志的记录,只需传入事件类型,其他信息会自动获取。

如何在MongoDB中存储审计日志?

审计日志通过AuditLogMongoService存储在MongoDB中,包含事件的详细信息。

FreeSQL的实体变化监控如何实现?

通过FreeSqlAuditEventHandler类,利用FreeSQL的Aop.CurdBefore事件捕获实体变化信息。

🏷️

标签

➡️

继续阅读