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

Rij*_*ael 3 php nginx error-log kibana

我有一个问题,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...."
Run Code Online (Sandbox Code Playgroud)

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

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

Jas*_*wer 7

不幸的是

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

PHP代码

您需要在应用程序中修复此问题(PHP代码).有三种方法可以影响PHP报告错误的方式,你可能想要使用全部3:

  • 注册自定义错误处理程序set_error_handler().该处理器将被调用的所有错误除E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,和大多数的E_STRICT地方在文件中提出的set_error_handler()被调用.

  • 注册自定义异常处理程序set_exception_handler().发生未捕获的异常时会调用此处理程序.

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

日志库

我可以建议你看一下Monolog.这是一个PSR-3投诉记录库,它也促进了我上面描述的内容.

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

替代

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

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