2

对于我当前的 Web 开发项目,我正在实施一个后端系统,该系统将标记错误并自动向管理员发送一封电子邮件,其中包含有关所发生事件的详细信息。捕获错误并使用适当的错误信息生成电子邮件非常简单;但是当人们考虑某些错误类型时会出现问题,特别是如果该站点被频繁访问。

考虑几个例子:

  1. 意外的数据库中断,导致 Web 服务器上的所有脚本都无法连接。如果说数据库服务器需要 2 分钟(120 秒)才能重新联机,并且 Web 服务器以 10/秒的速率接收唯一请求,那么在数据库服务器重新联机所需的时间内,管理员会发送电子邮件将被 1200 封相同的电子邮件淹没,所有这些电子邮件都在尖叫着无法连接到数据库。
  2. 某处脚本中的错误设法通过测试偷偷摸摸,并且是完全搞砸内容生成的各种错误,并且仅在特定的情况下发生(例如每 100 个请求一次)。再次使用 10/秒的唯一请求率意味着管理员将每 10 秒收到关于相同错误的相同电子邮件,直到它被修复。

我可以使用哪些方法/策略来防止这种情况发生?(我只对监控脚本产生的错误感兴趣,基础设施问题超出了这个解决方案的范围)

我将假设我几乎总是可以使用传递给set_error_handler设置的错误处理程序回调的一些值的摘要来唯一地识别错误。

第一个也可能是最明显的解决方案是在数据库中记录,并且仅在自上次发生后经过合理的最短时间后才发送电子邮件。这不是理想的方法,尤其是在数据库导致问题的情况下。另一种解决方案是在发生错误时将文件写入磁盘,并检查自上次修改文件以来是否经过了合理的最短时间段。除了我描述的两种方法之外,还有什么机制可以解决这个问题吗?

4

4 回答 4

2

为什么不简单地将它们全部发送出去,然后将它们收集并存储在接收端的数据库中。这样,您就可以绕过数据库成为服务器问题的可能性。

此外,在我看来,更大的优势是您不会随意丢弃有价值的取证数据。事后分析非常重要,任何类型的过滤都可能使其变得异常困难或不可能。

于 2009-02-11T03:00:41.287 回答
1

您是否尝试过研究像 SiteScope 这样的监控软件?

于 2009-02-11T02:59:02.490 回答
1

我所做的是监控错误日志,并每 5 分钟发送一次摘要。我想这是因为我的高质量代码(相对于一个不受欢迎的应用程序!),但我并没有受到太多麻烦:PI 基本上从头到尾读取日志文件,解析错误消息,并在时间戳 < 我上次运行作业的时间,然后发送一封简单的电子邮件。

这工作得很好。但是,如果您经常使用 POST,那么通过将 apache 访问日志与您的 php 错误日志相关联,您可以获得的信息量是有限的。我记得读过有关从 apache 中将 POST 记录到文件的模块,但不记得具体细节。

但是,如果您愿意使用错误处理程序在某处进行写入,那可能是最好的,因为您可以访问更多信息。ip、会话 id(以及任何可能影响设置的用户信息,例如分页或其他)、函数参数(debug_backtrace 或其他任何内容)... 编写每个错误,仅在出现新错误时或在错误发生后发送消息已被确认(如果您愿意编写这样的系统)。

于 2009-02-11T04:17:16.860 回答
0

您应该继续生成所需的任何日志文件。但与其自己发送电子邮件,不如将日志连接到像Nagios这样的监控系统。让监控解决方案决定何时提醒管理员以及多久提醒一次。

于 2009-02-11T15:35:35.713 回答