Nginx PHP-FPM将堆栈跟踪日志分解为单独的事件
我在PHP-FPM中将单个事件注册为多个事件时遇到问题。以下面的堆栈跟踪为例:Nginx PHP-FPM将堆栈跟踪日志分解为单独的事件,nginx,php,kibana,error-log,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: "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种方法:
- 向注册自定义错误处理程序。除了
,E_ERROR
,E_PARSE
,E_CORE_ERROR
,E_CORE_WARNING
,E_COMPILE_ERROR
,以及调用E_COMPILE_WARNING
的文件中提出的大部分set_ERROR_handler()
错误,都会调用此处理程序E_STRICT
- 向注册自定义异常处理程序。发生未捕获异常时调用此处理程序
- 向注册自定义关机功能。脚本执行完成后或调用
后调用此函数。这一个对于检测未使用错误处理程序处理的错误非常有用exit()
我劝你不要走这条路。编写这样的脚本可能很棘手,而且很容易出错。从应用程序本身进行日志记录更加稳定和可靠。首先,为什么会将错误输出到
stderr
?我会的,这对我来说更干净。你在上面看到的输出就是这样做的。谢谢你的现实检查:)我将进行实验,看看会产生什么结果。我唯一关心的是独白的表演。这显然需要稍长一点的时间,但有多少还没有确定(至少对于我正在工作的当前项目来说是这样)。我怀疑当您只启用错误处理程序时,您是否会检测到时间或内存上的任何差异。即使你开始通过独白记录其他东西,惩罚也很小。但不要相信我的话,运行一些基准测试!写得好。我支持使用脚本转换输出的想法,但它应该使用进程ID进行分组,而不是使用一个相当模糊的“完整事件”。当然,您应该记住,ID是在特定时间后重新发布的,因此您可能也希望包含时间戳。