Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx PHP-FPM将堆栈跟踪日志分解为单独的事件_Nginx_Php_Kibana_Error Log - Fatal编程技术网

Nginx 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

我在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种方法:

  • 向注册自定义错误处理程序。除了
    E_ERROR
    E_PARSE
    E_CORE_ERROR
    E_CORE_WARNING
    E_COMPILE_ERROR
    E_COMPILE_WARNING
    ,以及调用
    set_ERROR_handler()
    的文件中提出的大部分
    E_STRICT
    错误,都会调用此处理程序

  • 向注册自定义异常处理程序。发生未捕获异常时调用此处理程序

  • 向注册自定义关机功能。脚本执行完成后或调用
    exit()
    后调用此函数。这一个对于检测未使用错误处理程序处理的错误非常有用

日志库 我建议你去看看。这是一个PSR-3投诉日志库,它也促进了我上面描述的内容

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

可供替代的 另一个选项是创建一个代理脚本,该脚本将读取PHP-FPM日志文件和缓冲区行,直到收集到“完整事件”。然后将其作为您正在使用的服务的单个条目写入


我劝你不要走这条路。编写这样的脚本可能很棘手,而且很容易出错。从应用程序本身进行日志记录更加稳定和可靠。

首先,为什么会将错误输出到
stderr
?我会的,这对我来说更干净。你在上面看到的输出就是这样做的。谢谢你的现实检查:)我将进行实验,看看会产生什么结果。我唯一关心的是独白的表演。这显然需要稍长一点的时间,但有多少还没有确定(至少对于我正在工作的当前项目来说是这样)。我怀疑当您只启用错误处理程序时,您是否会检测到时间或内存上的任何差异。即使你开始通过独白记录其他东西,惩罚也很小。但不要相信我的话,运行一些基准测试!写得好。我支持使用脚本转换输出的想法,但它应该使用进程ID进行分组,而不是使用一个相当模糊的“完整事件”。当然,您应该记住,ID是在特定时间后重新发布的,因此您可能也希望包含时间戳。