【问题标题】:Errors not being written to error.log, inside a custom class错误未写入自定义类中的 error.log
【发布时间】:2021-08-03 10:46:44
【问题描述】:

我用一堆自定义类和自定义功能制作了一个 WordPress 主题(不过这更像是一个 PHP 问题)。过去,每当其中一个课程出现问题时,我都可以查看wp-content/debug.log 以查看问题所在。这已经可靠地工作了 6 个月。

但现在我遇到了一个错误,它在前端显示:

您的网站出现严重错误。请检查您的站点管理员电子邮件收件箱以获取说明。

但是如果我检查wp-content/debug.log,那么我看不到任何错误。


解决方案尝试 1:尝试“引发”错误

我尝试将其添加到我的 functions.php 文件的顶部:

if( !empty( $_GET['test'] ) ){
    require('some/path/that/doesnt/exists.php' );
}

然后访问:https://example.org/?test=1234

这会导致“严重错误” - 并将输出写入wp-content/debug.log。错误是:

[2021 年 8 月 3 日 09:20:10 UTC] PHP 警告:require(some/path/that/doesnt/exists.php):无法打开流:在线...中没有这样的文件或目录...

但是...如果我将错误行 (require('some/path/that/doesnt/exists.php' );) 移动到我的一个自定义类中,我知道会抛出错误,我在 debug.log 中什么也得不到。嗯!

解决方案尝试 2:确保 debug.log 不会太大

有时我会看到奇怪的结果,如果 debug.log 很大(比如 50mb+)。所以我尝试删除它并创建一个新的。结果一样。

解决方案尝试 3:确保正确设置调试设置

这就是我在 wp-config.php 中的内容:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set('display_errors',0);

因为它会在错误的require()-function 上抛出应有的警告,所以我认为它应该是这样的。

解决方案尝试 4:尝试指向不同的 debug.log 文件

我可以更改 WordPress 将写入的文件,但替换这一行:

define( 'WP_DEBUG_LOG', true );

用这一行:

define( 'WP_DEBUG_LOG', 'wp-content/new-debug.log' );

但这里也一样:仍然只出现一些错误。

解决方案尝试 5:确保 error_reporting 设置正确

我尝试按照那里的答案中建议的instructions on setting error_reporting 进行操作。

但我的 debug.log 文件中仍然没有出现错误。

如果我写这些行:

var_dump(E_ALL);
var_dump(E_STRICT);
var_dump(E_ALL | E_STRICT);
var_dump(E_ALL & E_STRICT);

然后输出:

int(32767) int(2048) int(32767) int(2048)

在设置 ini_sets 之后,在wp-config.php-文件中执行此操作时,以及如果我在“不写入 debug.log”-文件的类之一中执行此操作。不过,我不确定这意味着什么。

解决方案尝试 6:清除缓存

我尝试清除一堆缓存:服务器清漆缓存。使用 WordPress 插件的缓存设置。没有任何改变。

解决方案尝试 7:阅读 WordPress 故障排除文档

我阅读了WordPress Documentation on Troubleshooting,但在其中找不到任何内容。

解决方案尝试 8:复制到其他服务器并尝试复制错误(SUPER-WIERD!)

这就是它变得非常奇怪的时候!

我将站点复制到另一台服务器,起初同样的问题存在:我在前端收到错误,但没有写入 wp-content/debug.log

然后我尝试对导致此“严重错误”的确切原因进行二进制搜索。所以我浏览了添加行的文件:

<?php
die('Do I make it this far?');
?>

然后通过代码将其向下移动。最后,我发现是这里的这一行:

if( array_key_exists( $some_id, $shortlisted_part_ids ) ){

...其中$shortlisted_part_ids 为空(不是数组)。

但是发现之后,我删除了我的“die()”语句,然后wp-content/debug.log-FILE 中出现了错误!?在不更改任何其他内容的情况下,除了通过代码使其“死”无数次。

请注意,这仅在开发服务器上。如果我将相同的die()-statement 添加到生产服务器,然后再次将其删除,那么 (sigh),仍然在前端收到严重错误,并且错误中仍然没有写入任何内容-日志。

未尝试的解决方案

  • 列出最近更改的文件:我认为可能是要写入调试文件的插件或一些代码更改。因此,如果我列出了最近更改的文件,在出现严重错误后,它可能会显示错误正在写入哪个文件。我四处搜索,试图找到这个终端命令 - 并玩弄了grep,但我找不到正确的命令。
  • 启动服务器:我没有尝试重启服务器,因为它是一个生产环境,有很多访问者。即使这样可以解决问题,我也讨厌依靠启动某些东西来使其工作。
  • 停用插件 + 更改主题:我没有尝试过通常的做法:停用所有插件并更改为默认主题',因为 - 再次 - 这不是一种可行的故障排除技术,

其他评论

  • Xdebug:我最近尝试在该服务器上设置 Xdebug。也许我在做的时候做了什么。我无法理解的是,有些错误会显示,有些则不会。
  • 管理员电子邮件:有时我收到并发送错误电子邮件?!

【问题讨论】:

  • 你查看过 php apache 日志 (/var/log/apache2/error_log) 吗?
  • 感谢您的参与。为什么 apache-logs 应该有解决此问题的方法?我应该在其中寻找什么?
  • 我的 apache 日志显示任何。 PHP 错误。在代码中出现致命错误。
  • 您可以使用find . -type f -newermt '2021-08-19' 之类的内容检查最近修改的文件。测试的服务器是否安装了相同的 PHP 版本?
  • @cezaryta 成功了!我找到了另一个文件,在那里我可以找到所有“消失”的错误。如果您将评论作为解决方案发表,那么我可以奖励您。出于某种原因,错误现在显示在/wp-content/uploads/wc-logs/fatal-errors-DATETIMESTAMP-RANDOMSTRING.log 中。我不知道为什么他们没有更早地打印在那里。我认为是一些竞争条件(因为我还没有更新 WooCommerce)。

标签: php wordpress woocommerce


【解决方案1】:

最近修改的文件可以通过类似的方式找到 find . -type f -newermt '2021-08-19'。这只是解决方案的一部分。

还需要记住,WooCommerce 可以拦截 PHP 错误并将它们记录在 /wp-content/uploads/wc-logs/... 中。 (信用:Zeth)。

【讨论】:

  • 也许将我的答案内容添加到您的答案中,以防其他人遇到同样的问题。你知道的,声明WC可以拦截错误并且它们可以在/wp-content/uploads/wc-logs/...中找到。
  • 没错,它可能会有所帮助。起初我不想使用解决方案的一部分,那是你的,不是我的,但我希望添加的功劳能解决问题:-)
猜你喜欢
  • 2012-10-31
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2019-04-12
  • 1970-01-01
  • 2020-01-09
相关资源
最近更新 更多