我在 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 将每个堆栈跟踪注册为一个事件?
最佳答案
不幸的是没有
PHP-FPM 只是将每一行 PHP 输出记录为一个单独的事件。在 PHP-FPM 中/使用 PHP-FPM 无法改变这一点。
PHP代码
您需要在您的应用程序(PHP 代码)中“修复”这个问题。有 3 种方法可以影响 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 日志文件和缓冲区行,直到收集到“完整事件”。然后将其写为您正在使用的服务的单个条目。
我建议你不要走这条路。编写这样的脚本可能很棘手,而且很容易出错。从您的应用程序本身进行日志记录更加稳定和可靠。
关于nginx - PHP-FPM 将堆栈跟踪日志分解为单独的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25037576/