在Docker容器中只logging来自PHP-FPM的真实致命错误

我在分离的Docker容器中使用PHP-FPM的NGINX。 我只想得到错误的stderr,以便我可以收集他们在一个集中的日志服务器上。 问题是:我使用WP,似乎有一些写得不好的插件。 他们的工作,但导致这样的警告:

PHP错误:7#7:* 1 FastCGI在stderr中发送:“PHP消息:PHP警告:参数1到wp_default_scripts()有望成为引用,/ www / wp中给出的值 – 在601行包括/ plugin.php

testing脚本示例,这应该会给stderr一个致命的错误:

<?php not_existing_func(); 

PHP-FPM被configuration为将错误logging到stderr中,如下所示:

 [global] log_level = error error_log = /proc/self/fd/2 

我想知道,这在上面的脚本没有给我什么。 就在我至lessnoticelog_level之后,我在docker容器的控制台上发现了exception:

[17-Jun-2017 01:45:35]警告:[pool www] child 8对stderr说:“注意:PHP消息:PHP致命错误:未捕获错误:调用/ www / x中的未定义函数not_existing_func()。 PHP:2"

为什么这是地狱呢? 对我来说,我们在这里显然有一个致命的错误,就像这个消息指出的,导致脚本无法继续(当然,我们在浏览器中会得到500错误)。 我不得不通过设置log_levelnotice这样我才不会错过被警告的严重错误。 同时,我的日志充满垃圾警告从WordPress主题,插件等,我还没有开发,我不想修复更新的原因…

我试了一下,发现php.ini中的log_errors是PHP-FPM获取任何信息所必需的。 但是,来自error_reporting的日志级别似乎也是有线的。 为了testing目的,我使用了以下configuration:

 display_errors = Off log_errors = On error_log = /proc/self/fd/2 ;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR error_reporting = 0 

结果:我收到了通知,但没有提供有关我致命错误的信息…

首先,我了解到我错了:Wordpress是这个问题的根源,而不是PHP直接。 这是一个众所周知的事实,当debugging启用WP操纵error_reporting ,所以我检查在我的configurationWP_DEBUGfalse 。 但是即使有这套, 文件说

除了“error_reporting”之外,如果WP_DEBUG被定义为false,WordPress会将其设置为4983。 […]

所以我的设置到php.ini是正确和充足的。 我甚至不需要php-fpm设置,当错误被redirect到php.ini文件中的标准输出。

如何防止WordPress操纵错误报告?

这也不是那么容易。 虽然WordPress的文档说, wp-config.php是设置错误报告等全球范围设置的好地方,但他们后来被神覆盖到了4983 。 我不知道在哪里。 也许它甚至不是WordPress的核心,但一些不好开发的插件或主题。

我们可以通过将error_reporting添加到禁用的函数来处理这个问题:

 disable_functions = error_reporting 

现在不可能覆盖我们的error_reporting 。 我认为这是最好的解决scheme,以确保我们没有得到任何其他错误报告的外部影响从插件或主题。 也在未来。 由于PHP允许这样的混乱,我们需要考虑这样的事情。

基本上,我们可以批评,这使得我们通过将WP_DEBUG设置为true来获得更多的日志。 那就对了。 但是,由于我们在一个高效的系统上,对于我来说在这种方式下进行故障排除似乎是错误的。 我们不应该在应用程序的基础上做到这一点,特别是没有display_errors ! 相反,find问题的工作stream程应该是查看错误日志。

应该始终logging并检查致命错误。 如果这还不够,可以在更高级别上设置error_reporting来获取有关可能的问题的信息,如警告。