应用程序基础上的错误日志记录/处理?

3
我们有一个Web服务器,即将在上面启动多个应用程序。在服务器级别上,我们已经通过Hyperic的帮助解决了错误处理问题,以便在数据库/memcached服务器出现故障时通知负责人。
然而,我们仍然需要处理那些发生在应用程序级别的错误和日志事件,以便为我们的客户改进应用程序,在客户注意到之前解决问题。
那么,这种情况下有什么好的解决方案呢?使用PHP自己的错误日志可能会很快被大量同时运行的应用程序堵塞。如果您想要结构化,这可能不是最佳选择。
一种想法是构建一个轻量级的离线错误处理应用程序,它具有REST/JSON API,接收加密和序列化的错误消息数组,并将它们存储到数据库中。也许根据错误的严重程度,它还可以直接输入到我们的缺陷跟踪器中。这可能需要花费一些时间,但似乎是一个相当脆弱的解决方案,我相信已经有更好、更可靠的替代方案存在。
谢谢。
4个回答

4
为什么使用PHP自己的error_log会很快变得“堵塞”?如果一切顺利,你不会看到太多错误,对吧?
为了记录错误而构建一个单独的应用程序,特别是使用API的应用程序,会为错误日志记录添加许多可能的故障点,如果你问我。也许你可以构建一个应用程序,检查各个服务器/不同应用程序上的现有错误日志,以便能够在一种错误仪表板中显示它们,这样当事情真正出错时就可以看到。
但我也很想看看其他人可能会提出什么建议,对于自己来说,我还没有考虑那么多。

当然,目标始终是保持最终错误数量的低,但随之而来的是人为因素。我相信,在部署到客户生产应用程序时,我们总会出现一些问题。您的方法绝对值得考虑! - Industrial
1
人为因素是应用程序的噩梦 ;) 我理解你的意思,但如果你有时间开发新东西,我肯定有好方法来监控现有的错误日志(我会为每个应用程序使用单独的日志文件)。只使用最后修改日期和文件大小(如果它在一夜之间加倍,那么可能有问题)是我能想到的两件事情... 虽然我对这个想法很感兴趣,但可能会把它添加到我的项目待办列表中。 - CharlesLeaf

2
我们实际上使用 tail -f 命令来跟踪服务器的 php 错误日志以获取各种输出,但也会捕获我们自己抛出的许多异常。通过抛出自定义异常,您可以使其(根据优先级)写入数据库、日志流、错误跟踪器和/或向负责该模块的人发送电子邮件。当然,您应该记录引发异常的原因(例如,var_export()/serialize() 方法中抛出异常的 func_get_args())。将异常消息设置为巨大,因为这将为您节省时间。
除此之外,我们还使用 Zend_Log,在这里异常有点过度(例如,如果传递给方法的参数应该被弃用,我们可能会记录一些 debug_backtrace() 来查看该调用来自哪里。这可以扩展到制作昂贵调用图表的程序等,但这是一个次要问题 :)
我的最佳提示: 了解您的应用程序可能失败的地方以及它无法失败的地方,这样搜索错误就会更容易。确保基于外部服务引发的错误被正确解释为此类错误。
......老实说,我认为这种思维方式(在应用程序级别上使用错误API/服务)有点奇怪:如果您确切地知道如何处理错误,为什么要防止错误?难道您不会避免/自动化它吗?

1

您可以使用 set_exception_handlerset_error_handler 来收集更具体的信息,并以减轻“阻塞”的方式报告它。您可以为每个客户或应用程序使用不同的文件,引入自己的代码,以便错误解析脚本轻松处理等。

我会谨慎地介绍额外的代码或基础设施到错误处理过程中。它需要非常坚固,以便您可以信任所获得的信息。直接将错误报告给数据库?那数据库连接错误怎么办?(等等)


1
你正在寻找的是PHP错误处理函数:http://de.php.net/manual/en/ref.errorfunc.php
尤其有趣的是set_error_handler(),它允许你完全覆盖PHP内部的错误处理程序。
通过这个,你可以为每个应用程序制作自己的日志/向管理员发送电子邮件/将错误信息保存到数据库/通知用户管理员已收到或其他操作。
通过返回true或false,你还可以控制在你的函数执行后是否运行PHP内部的错误处理程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接