【问题标题】:PHP-FPM breaks up stack trace log into separate eventsPHP-FPM 将堆栈跟踪日志分解为单独的事件
【发布时间】:2014-07-30 13:03:38
【问题描述】:

我遇到了 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 将每个堆栈跟踪注册为 one 事件?

【问题讨论】:

标签: nginx php kibana error-log


【解决方案1】:

很遗憾没有

PHP-FPM 只是将 PHP 输出的每一行记录为一个单独的事件。您无法在 PHP-FPM 中/使用 PHP-FPM 进行任何更改。

PHP 代码

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

  • 使用set_error_handler() 注册自定义错误处理程序。除了E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING 以及在调用set_error_handler() 的文件中引发的大部分E_STRICT 之外,都会调用此处理程序。

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

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

日志库

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

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

另类

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

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

【讨论】:

  • 感谢您的实际检查:) 我将进行实验,看看会产生什么。我唯一关心的是独白的表现。显然需要更长的时间,但有多少还有待确定(至少对于我正在进行的当前项目而言)。
  • 我怀疑当您仅启用错误处理程序时,您会检测到时间或内​​存方面的任何差异。即使您开始通过 Monolog 记录其他内容,惩罚也将是微不足道的。但不要相信我的话,运行一些基准测试!
  • 不错的文章。我会支持使用脚本来转换输出的想法,但它应该使用进程 ID 进行分组,而不是使用相当模糊的“完整事件”。当然,您应该记住,ID 会在一定时间后重新颁发,因此您可能也需要涉及时间戳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多