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