English 中文(简体)
(Windows)异常处理:将其记录到事件日志还是数据库中?
原标题:
  • 时间:2008-10-26 20:42:52
  •  标签:

我曾在商店工作,将异常处理引入事件日志和数据库表中。

每个都有它们的优点,基于我的经验我可以强调一些。

事件日志 (Shìjiàn rìzhì)

  • Industry standard location for exceptions (+)
  • Ease of logging (+)
  • Can log database connection problems here (+)
  • Can build report and viewing apps on top of the event log (+)
  • Needs to be flushed every so often, if alot is reported there (-)
  • Not as extensible as SQL logging [add custom fields like method name in SQL] (-)

SQL/数据库

  • Can handle large volumes of data (+)
  • Can handle rapid volume inserts of exceptions (+)
  • Single storage location for exception in load balanced environment (+)
  • Very customizable (+)
  • A little easier to build reporting/notification off of SQL storage (+)
  • Different from where typical exceptions are stored (-)

我是否忽略了任何重要的考虑?

我相信其中一些观点值得讨论,但我很好奇其他团队最有效的方法是什么,为什么你对这个选择感到强烈。

最佳回答

你需要区分日志记录和跟踪。虽然这两者之间的区别有些模糊,但我倾向于认为日志记录是“非开发者的东西”。例如未处理的异常、损坏的文件等等。这些绝对不是正常情况,应该是极少见的问题。

追踪是开发人员感兴趣的内容。堆栈跟踪、方法参数,网页服务器返回了HTTP状态401.3等。这些内容非常嘈杂,并且在短时间内能产生大量的数据。通常我们有不同级别的追踪,以减少噪音。

对于客户端应用程序的登录,我认为事件日志是可行的方式(我需要双重检查,但我认为ASP.NET健康监测也可以将信息写入事件日志)。只要安装程序(通常由管理员安装)创建事件来源,普通用户就有权限写入事件日志。

大多数关于 SQL 日志记录的优势,虽然是真的,但并不适用于事件日志记录。

  • Can handle large volumes of data: Do you really have large volumes of unhandled exceptions or other high level failures?
  • Can handle rapid volume inserts of exceptions: A single unhandled exception should bring your app down - it s inherently rate limited. Other interesting events to non developers should be similarly aggregated.
  • Very customizable: The message in an Event Log is pretty much free text. If you need more info, just point to a text or structured XML or binary file log
  • A little easier to build reporting/notification off of SQL storage: Reporting is built in with the Event Log Viewer, and notification systems are, either inherent - due to an application crash - or mixed in with other really critical notifications - there s little excuse for missing an Event Log message. For corporate or other networked apps, there s a thousand and 1 different apps that already cull from Event Logs for errors...chances are your sysadmin is already using one.

对于跟踪,其中异常或错误的具体细节是其一部分,我喜欢使用平面文件-它们易于维护,易于grep,并且如果我愿意,可以将其导入Sql进行分析。

90%的时间,您不需要它们,它们被设置为警告或错误。但是,当您将它们设置为INFO或DEBUG时,您将生成大量数据。关系型数据库管理系统具有许多开销 - 用于性能(ACID,并发等),存储(事务日志,SCSI RAID-5驱动器等)和管理(备份,服务器维护等) - 所有这些对于跟踪日志来说都是不必要的。

问题回答

我不会直接登录到数据库。就像您所说,数据库问题变得棘手难以记录 :)

我想记录到文件系统中,并且有一个任务从文件中批量插入到数据库中。个人而言,我喜欢将日志记录在数据库中,主要为了扩展性的情况 - 我基本上认为我会有多台机器运行,并且能够有效地拥有一个组合日志非常方便。 (当然,每个条目都应说明它来自哪台机器。)

报告和查看应用程序可以从数据库中非常容易地完成 - 目前可能还没有很多专门日志记录的报告工具,但几乎所有数据库都具有通用报告功能。

为了方便记录,我会使用像log4net这样的框架,它可以大大减少记录工作的复杂程度,而且是一个经过验证和测试的解决方案。此外,这意味着您可以在不更改代码的情况下更改输出策略。如果需要,您甚至可以同时记录事件日志和数据库,或者将一些日志记录到一个地方,将一些日志记录到另一个地方。 (我基于.NET做出了这个假设,但许多平台也有类似的记录框架。)

关于事件记录需要考虑的一件事是,有一些产品可以监视服务器日志(如Microsoft Operations Manager)并智能地进行通知,并在内容上收集统计信息。

SQL日志记录的一个“负面”是它给您的应用程序增加了另一层依赖关系,这可能有时是可以接受的,也可能不可接受。在我的职业生涯中,我曾经两种方式都做过。我甚至使用基于MSMQ的消息队列来排队日志事件,并将队列清空到MSSQL数据库中,以消除客户端软件连接到数据库的需求。

关于写入事件日志的一点说明:这需要应用程序用户的特定权限,在某些环境下可能会受到默认限制。

我所在的地方,我们大部分都将日志记录到数据库中,并备份为平面文件。这相当不错,我们可以做一些事情,比如当我们进行更改时,给一个应用程序观察几天的RSS订阅源。





相关问题
热门标签