一个警告:在大型商店中有超过100个应用程序,可能有数百甚至数千台主机运行这些应用程序时,请避免使用任何导致紧密耦合的东西。这基本上排除了直接连接到SQL Server或任何数据库解决方案,因为您的应用程序日志记录将取决于日志存储库的可用性。
中央存储库的可用性比“如果无法连接,则不记录”要复杂一些,因为通常最有趣的事件发生在出现问题时,而不是万事大吉时。如果您的日志记录正好在事情变得有趣时删除条目,那么它永远不会被信任来解决事件,并因此未能获得其他利益相关者(即应用程序所有者)的支持和推动。
如果您决定自行实现保留并重试失败的日志信息传递,您将面临艰巨的挑战:这不是一个简单的任务,比听起来要复杂得多,从高效可靠地存储保留的信息开始,到实施良好的重试和智能回退逻辑结束。
您还必须回答身份验证和安全性问题。大型组织具有多个域,具有各种信任关系,员工通过VPN或来自家庭的直接访问进行冒险,一些应用程序无人值守运行,某些服务配置为以本地用户身份运行,某些计算机没有加入域等等。您最好回答每个应用程序的日志记录模块到处部署时将如何验证与中央存储库的身份(以及哪些情况将不受支持)的问题。
理想情况下,您应该使用现成的日志记录模块传递机制。 MSMQ可能是最合适的选择:强大的异步可靠传递(至少在大多数用例的范围内),在每个Windows主机上都可用(可选)。这是最大的痛点,您的应用程序将依赖于非默认的操作系统组件。
中央存储库存储必须能够提供请求的信息,例如:
- 应用程序开发人员调查事件
- 客户支持团队调查由客户投诉报告的丢失交易
- 安全组进行取证
业务经理需要统计数据、趋势和聚合信息(BI)。
对于任何规模较大、寿命较长的组织来说,唯一能够提供这种功能的存储方式是关系型引擎,因此可能会选择 SQL Server。在文本文件上进行分析真的不会有太大作用。
因此,我建议使用基于消息传递的日志传输/交付(MSMQ)和关系型中央存储库(SQL Server),可能还要在其上面添加分析组件(Analysis Services Data Mining)。正如您所看到的,这显然不是小事,它涵盖的范围略微超出了配置 log4net。
至于记录什么,您已经考虑过了,但我想再补充一点:通常情况下,特别是在事件调查时,您希望能够请求额外的信息。这意味着您想要知道来自事件机器的某些文件内容、某些注册表键、某些性能计数器值或完整的进程转储。能够从中央存储库界面请求此信息非常有用,但总是收集此信息并不切实际,因此必须在应用程序和中央存储库之间建立某种双向通信,当应用程序报告事件时,可以要求添加额外的信息(例如故障进程的转储)。必须有很多基础设施才能实现这样的事情,从应用程序日志和中央存储库之间的协议,到中央存储库识别重复事件的能力,再到日志记录库收集所需的额外信息的能力,以及操作员标记下一次发生需要额外信息的事件的能力。
我理解这个答案可能看起来有些过度,但我曾经在这个问题领域工作了相当长时间,当我还在微软公司时,我曾经查看过许多 Dr. Watson 的在线崩溃报告,我可以告诉您,这些要求是存在的,它们是有效的关注点,当实现这个解决方案时,会极大地帮助。最终,您无法修复您无法测量的问题。一个大型组织依赖于对其应用程序库进行良好的管理和监控,包括日志记录和审计。
有一些第三方供应商提供解决方案,其中一些甚至与Log4net集成,例如bugcollect.com(全面披露:这是我的公司),错误流量控制器或Exceptioneer等。