6

我曾在一些商店工作过,我在事件日志和数据库表中实现了异常处理。

每个都有其优点,我可以根据我的经验强调一些优点:

事件簿

  • 例外情况的行业标准位置 (+)
  • 易于记录 (+)
  • 可以在此处记录数据库连接问题 (+)
  • 可以在事件日志之上构建报告和查看应用程序 (+)
  • 需要经常冲洗,如果那里报告很多(-)
  • 不如 SQL 日志记录那样可扩展[在 SQL 中添加自定义字段,如方法名称] (-)

SQL/数据库

  • 可以处理大量数据 (+)
  • 可以处理异常的快速批量插入 (+)
  • 负载均衡环境中异常的单一存储位置 (+)
  • 非常可定制 (+)
  • 从 SQL 存储中构建报告/通知更容易一些 (+)
  • 不同于存储典型异常的位置 (-)

我是否遗漏了任何主要考虑因素?

我确信其中一些观点值得商榷,但我很好奇什么对其他团队最有效,以及为什么你对这个选择有强烈的感觉。

4

4 回答 4

4

您需要区分日志记录和跟踪。虽然线条有点模糊,但我倾向于将日志记录视为“非开发人员的东西”。诸如未处理的异常、损坏的文件等。这些绝对是不正常的,应该是一个非常罕见的问题。

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

对于登录客户端应用程序,我认为事件日志是要走的路(我必须仔细检查,但我认为 ASP.NET 健康监控也可以写入事件日志)。普通用户有权写入事件日志,只要您有安装程序(无论如何都由管理员安装)创建事件源。

Sql 日志记录的大部分优势虽然是真的,但不适用于事件日志记录:

  • 可以处理大量数据: 您是否真的有大量未处理的异常或其他高级故障?
  • 可以处理快速大量插入的异常:一个未处理的异常应该会让你的应用程序崩溃——它本质上是速率受限的。其他对非开发人员感兴趣的事件也应该类似地汇总。
  • 非常可定制:事件日志中的消息几乎是自由文本。如果您需要更多信息,只需指向文本或结构化 XML 或二进制文件日志
  • 从 SQL 存储中构建报告/通知更容易一些:报告内置于事件日志查看器中,并且通知系统是固有的 - 由于应用程序崩溃 - 或与其他非常重要的通知混合 - 没有什么借口缺少事件日志消息。对于企业或其他联网应用程序,已经从事件日志中剔除一千零一个不同的应用程序以查找错误......您的系统管理员可能已经在使用一个。

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

90% 的情况下,您不需要它们,它们被设置为 WARN 或 ERROR。但是,当您将它们设置为 INFO 或 DEBUG 时,您将生成大量数据。RDBMS 有很多开销——性能(ACID、并发等)、存储(事务日志、SCSI RAID-5 驱动器等)和管理(备份、服务器维护等)——所有这些都是跟踪日志是不必要的。

于 2008-10-26T21:21:12.360 回答
3

我不会直接登录到数据库。正如你所说,数据库问题变得难以记录:)

我会登录到文件系统,然后有一个从文件批量插入到数据库的作业。就我个人而言,我喜欢在日志中运行数据库中的日志,主要用于扩展情况——我几乎假设我将运行不止一台机器,并且能够有效地拥有一个组合日志很方便。(当然,每个条目都应该说明它来自哪台机器。)

报告和查看应用程序可以很容易地从数据库中完成 - 目前可能存在较少的日志专用报告工具,但几乎所有数据库都具有通用报告功能。

为了便于记录,我会使用像log4net这样的框架,它需要付出很多努力,并且是一个久经考验的解决方案。除此之外,这意味着您可以在不更改代码的情况下更改输出策略。如有必要,您甚至可以同时记录到事件日志和数据库,或者将一些日志发送到一个地方,而将一些日志发送到另一个地方。(我在这里假设 .NET,但许多平台都有类似的日志框架。)

于 2008-10-26T20:51:12.407 回答
2

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

基于 SQL 的日志记录的一个“缺点”是它向您的应用程序添加了另一层依赖关系,这可能会或可能不会总是可接受的。在我的职业生涯中,我都做到了。我曾经甚至两次使用基于 MSMQ 的消息队列来对日志事件进行排队并将队列清空到 MSSQL 数据库中,以消除我的客户端软件与数据库连接的需要。

于 2008-10-26T20:48:50.227 回答
1

关于写入事件日志的一个注意事项:这需要您的应用程序用户具有某些权限,在某些环境中默认情况下可能会受到限制。

在我所在的位置,我们将大部分日志记录到数据库中,并使用平面文件作为备份。非常好,我们可以做一些事情,比如在我们做出改变时为应用程序获取一个 RSS 提要,以便观看几天。

于 2008-10-26T20:47:18.607 回答