PHP-FPM将堆栈跟踪日志分解为单独的事件

时间:2014-07-30 13:03:39

标签: nginx php kibana error-log

PHP-FPM将单个事件注册为多个事件时遇到问题。以下面的堆栈跟踪为例:

[30-Jul-2014 05:38:50] WARNING: [pool www] child 11606 said into stderr: "NOTICE: PHP message: PHP Fatal error:  Uncaught exception 'Zend_View_Exception' with message 'script 'new-layout.mobile.phtml' not found...."
[30-Jul-2014 05:38:50] WARNING: [pool www] child 11606 said into stderr: "Stack trace:"
[30-Jul-2014 05:38:50] WARNING: [pool www] child 11606 said into stderr: "#0 /usr/share/nginx/html/site.com/142-webapp/library/Zend/View/Abstract.php(884): Zend_View_Abstract->_script('new-layout.mobi...')"
[30-Jul-2014 05:38:50] WARNING: [pool www] child 11606 said into stderr: "#1 /usr/share/nginx/html/site.com/142-webapp/library/Zend/Layout.php(796): Zend_View_Abstract->render('new-layout.mobi...')"
[30-Jul-2014 05:38:50] WARNING: [pool www] child 11606 said into stderr: "#2 /usr/share/nginx/html/site.com/142-webapp/library/Zend/Layout/Controller/Plugin/Layout.php(143): Zend_Layout->render()"
[30-Jul-2014 05:38:50] WARNING: [pool www] child 11606 said into stderr: "#3 /usr/share/nginx/html/site.com/142-webapp/library/Zend/Controller/Plugin/Broker...."

如您所见,堆栈跟踪的每一行实际上都是一个具有自己时间戳的单独事件。将日志转发到另一个服务进行分析时会出现问题,因为当应将每个堆栈跟踪视为一个事件时,它们将被分解。目前我正在使用Kibana 3,这是一个噩梦,查看和管理堆栈跟踪,因为每一行都是一个单独的事件,并且各个事件并不总是按时间顺序排列。

如何让php-fpm将每个堆栈跟踪注册为一个事件?

1 个答案:

答案 0 :(得分:7)

不幸的是

PHP-FPM只是将每行PHP输出记录为单独的事件。在PHP-FPM中,你无法做任何事情来改变它。

PHP代码

您需要"修复"这在您的应用程序(PHP代码)中。有三种方法可以影响PHP报告错误的方式,您可能希望使用全部3:

  • 使用set_error_handler()注册自定义错误处理程序。除E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING以及大多数{{1}之外的所有错误都会调用此处理程序在调用E_STRICT的文件中引发。

  • 使用set_exception_handler()注册自定义异常处理程序。当发生未捕获的异常时,将调用此处理程序。

  • 使用register_shutdown_function()注册自定义关闭功能。在脚本执行完成或调用set_error_handler()后调用此函数。这个用于检测错误处理程序未处理的错误。

日志库

我可以建议你看一下Monolog。它是一个PSR-3投诉记录库,它也有助于我上面描述的内容。

此外,它有一个令人印象深刻的"处理程序列表"它可以将日志写入各种服务。您现在正在使用的服务很可能就在其中!

替代

另一个选择是创建一个代理脚本,它将读取PHP-FPM日志文件并缓冲行,直到"完整事件"聚集起来。然后将其作为单个条目写入您正在使用的服务。

我建议你走这条路。编写这样的脚本可能很棘手并且非常容易出错。从您的应用程序本身进行记录更加稳定可靠。