我正在使用 ASP.NET MVC 4 构建一个 Web 应用程序,数据存储由 T-SQL 数据库通过实体框架提供。我正在集成审计日志,我想提供一个很好的人类可读的操作摘要,以便我可以提供一个友好的日志视图,其中包含清晰的语句,如“用户 Bob 已登录”、“用户 Alice更新文章'Foo'”等。
审计记录目前包括:
- 图形用户界面
- 时间戳
- 用户身份
- 动作类别(控制器名称)
- 动作(动作方法名称)
- IsError(布尔值;true 表示这是错误记录,或者此操作未成功完成)
- 序列化细节的blob
目前,我的日志记录使用实现的自定义属性IActionFIlter
;该OnActionExecuting()
方法记录尝试的操作(将 URL、参数等内容序列化到详细信息 blob),OnActionExecuted()
如果没有错误,该方法返回并将 IsError 设置为 true,并将返回的结果或异常附加错误消息和堆栈跟踪等到细节。我想为描述字符串添加另一列,但我看不到一个整洁的方法。
我得到的最远的是将一个字符串传递给属性,例如“用户$用户登录”,然后让日志方法扫描字符串中的 $ 字符并用参数字典中键值匹配的任何内容替换该单词单词(减去 $ 字符)。这有点有限;例如,如果文章是按 ID 号存储的,那么您可以管理的最好是“用户 18 编辑文章 37”。没有真正的方法可以获取用户名或文章标题;您不能将实例数据传递给属性,因为它是在编译时烘焙的,而且我真的不希望我的日志记录方法进行各种数据库调用来获取那种数据,尤其是因为它变得不可能(或至少是真正的痛苦)拥有一个通用的日志记录方法。
所有这一切的替代方法是拥有一个静态审计日志记录类并AuditRecord.WriteLog(foo);
在各处调用类似的东西,也许使用某种描述符类我可以使用(或继承自)来描述不同类型的操作,存储所有参数并生成根据需要提供描述字符串,但对我来说似乎不太优雅;我真的很喜欢能够标记[AuditLog]
一个方法并知道它会被记录下来。
我想避免大量的条件逻辑,比如在一些大的 switch 语句中使用控制器和动作名称来选择正确的字符串模板。如果我可以在日志记录方法中获取诸如文章标题之类的东西,那就没问题了。有没有一种简洁、简单的方法来做到这一点?