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

标签 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: "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/

相关文章:

c# - 如何使用弹性REST API中的过滤器打开Kibana发现URL

docker - 在 docker : how to save dashboard? 上运行的 kibana

sockets - 配置 NGINX 以使用 SSL 包装非 SSL 服务

nginx - 使用已安装的 openresty 安装 resty.http

php - PHP的异步电子邮件?

javascript - 如何制作相同大小的缩略图

logstash - Kibana:搜索特定短语,不返回任何结果,而另一个搜索则返回该短语

django - 当下游处理 ssl 时,Nginx 在同一 server_name block 上从 http 重写为 https

ssl - 使用自签名 SSL 证书

php - 在拥挤的站点中存储页面点击的更好方法