一个警告世界:在一家大商店里有 100 多个应用程序,有成百上千台主机运行这些应用程序,请避开任何会导致紧密耦合的东西。这几乎排除了直接连接到 SQL Server 或任何数据库解决方案的可能性,因为您的应用程序日志记录将取决于日志存储库的可用性。
中央存储库的可用性比“如果无法连接,请不要记录它”稍微复杂一点,因为通常最有趣的事件发生在出现问题时,而不是在事情顺利进行时。如果您的日志记录恰好在事情变得有趣时删除条目,那么它将永远不会被信任来解决事件,因此将无法获得其他利益相关者(即应用程序所有者)的牵引力和支持。
如果您决定自己实现保留并重试失败的日志信息传递,那么您将面临一场艰苦的战斗:这不是一项微不足道的任务,而且比听起来要复杂得多,从保留信息的高效可靠存储开始并以建立良好的重试和智能后备逻辑结束。
您还必须对身份验证和安全问题有一个答案。大型组织有多个具有各种信任关系的域,员工通过 VPN 或在家中直接访问进行冒险,一些应用程序在无人值守的情况下运行,一些服务配置为本地用户运行,一些机器没有加入域等。你最好有回答这个问题的每个应用程序的日志记录模块如何部署,无处不在,将通过中央存储库进行身份验证(以及哪些情况将不被支持)。
理想情况下,您将为日志记录模块使用开箱即用的交付机制。MSMQ 可能是最合适的选择:健壮的异步可靠交付(至少在大多数用例的范围内),安装后可在每个 Windows 主机上使用(可选)。这是主要的痛点,您的应用程序将依赖于非默认操作系统组件。
中央存储库存储必须能够交付请求的信息,也许:
- 调查事件的应用程序开发人员
- 客户支持团队调查客户投诉报告的丢失交易
- 进行取证的安全组织
- 业务经理需要统计数据、趋势和汇总信息 (BI)。
唯一能够为任何重要的组织(大小、生命周期)提供此功能的存储是关系引擎,因此可能是 SQL Server。对文本文件进行分析真的不会走得太远。
因此,我会推荐一个基于消息传递的日志传输/传递 (MSMQ) 和一个关系中央存储库 (SQL Server),可能在其之上带有一个分析组件(分析服务数据挖掘)。如您所见,这显然是一项不小的壮举,它所涵盖的内容不仅仅是配置 log4net。
至于要记录什么,你说你已经考虑过了,但我想补充一下我的额外 2c:通常,特别是在事件调查方面,你会喜欢请求额外信息的能力。这意味着您想知道事件机器中的某些文件内容、某些注册表项、某些性能计数器值或完整进程转储。能够从中央存储库接口请求此信息非常有用,但始终收集此信息以防万一是不切实际的。这意味着应用程序和中央存储库之间必须存在某种双向通信,当应用程序报告事件时,可以要求它添加额外信息(例如,故障进程的转储)。
我知道这个答案目前可能看起来有点矫枉过正,但我参与这个问题空间已经有一段时间了,在我使用 MS 的那一天,我看过 Watson 博士的许多在线崩溃报告,我可以告诉您存在这些要求,它们是有效的关注点,并且在实施时,解决方案会提供极大的帮助。最终,您无法解决无法衡量的问题。大型组织依赖于对其应用程序库存的良好管理和监控,包括日志记录和审计。
有一些第三方供应商提供解决方案,有些甚至与 log4net 集成,如bugcollect.com (完全披露:这是我自己的公司)、错误流量控制器或Exceptioneer等。