AspNetCore开发笔记:进一步实现非侵入性审计日志功能
内容提要
本文介绍了作者对之前实现的审计日志功能进行重构的过程。作者将之前分散在各个目录中的与审计相关的代码整合到了一个目录中,提高了代码的可维护性。作者还对AuditLog类进行了重构,将实体变化内容从AuditLog中分离出来,使用List<EntityChangeInfo>类型的属性来存储实体变化。作者还对AuditLogAttribute类进行了修改,简化了参数,只需要传入EventType即可。最后,作者介绍了如何获取实体变化,并使用FreeSQL的Aop.CurdBefore事件来实现实体变化的监控。作者还提供了扩展方法来方便使用该功能。最后,作者展示了使用效果,并介绍了AuditLog中间件的作用。
延伸解读
审计日志的代码组织与可维护性
作者将原本分散的审计相关代码整合到统一的Contrib/Audit目录下,按功能划分为Services、Middlewares、Filters等子目录。这种组织方式使审计功能作为一个整体更易于维护和扩展,尤其适合中大型项目。读者在实现类似功能时,可参考这种按职责归类的目录结构,避免代码散落各处导致维护困难。
实体变化记录的分离设计
重构后的AuditLog类将实体变化内容从主日志中分离,使用List<EntityChangeInfo>类型的EntityChanges属性存储。EntityChangeInfo包含实体名、操作类型、SQL语句和参数。这种设计使审计日志结构更清晰,便于后续查询和分析。同时,通过FreeSQL的Aop.CurdBefore事件捕获变化,并暂存到HttpContext.Items中,最终由过滤器组装到AuditLog。
非侵入式审计的实现与局限
通过[AuditLog]特性和中间件,业务代码无需显式记录日志,实现了非侵入式审计。但实体变化监控依赖ORM的AOP事件,目前仅实现了FreeSQL版本,其他ORM需单独适配。此外,中间件生成的EventId并未实际使用,作者保留以备后续扩展。读者需注意,不同ORM的监控能力可能影响审计的完整性。
扩展方法与配置的便捷性
作者提供了AddAudit和UseAudit扩展方法,简化了服务和中间件的注册,符合AspNetCore的开发习惯。在Program.cs中只需两行代码即可启用审计功能。不过,AddAudit方法直接接收IConfiguration参数,作者也指出可通过依赖注入优化。这种扩展方法模式值得在类似功能中借鉴,以降低使用门槛。
Q&A
如何实现完全无侵入的审计日志功能?
通过在需要审计的接口上加上 [AuditLog] 特性,可以记录该接口的操作日志和相关的实体变化记录。
重构后的AuditLog类有什么变化?
AuditLog类将实体变化内容分离到EntityChanges属性中,使用List<EntityChangeInfo>类型来存储实体变化。
如何获取实体变化信息?
通过FreeSQL的Aop.CurdBefore事件,可以实现实体变化的监控,并获取实体变化信息。
AuditLogAttribute类的参数简化了哪些内容?
AuditLogAttribute类的参数简化为只需传入EventType,其他信息会自动获取。
如何在AspNetCore中注册审计服务和中间件?
可以通过扩展方法AddAudit和UseAudit来注册审计服务和中间件,符合AspNetCore的开发习惯。
审计日志记录的效果如何?
审计日志成功记录在MongoDB中,包含事件ID、事件类型、用户信息和实体变化等详细信息。