WordPress 开了 WP_DEBUG_LOG,日志文件却一直不出现
把 WP_DEBUG 和 WP_DEBUG_LOG 都设成 true,刷新页面,wp-content/debug.log 还是不存在。我第一次碰上以为是目录权限,chmod 了整层,白折腾。 后来发现是我把 define 写到了主题的 fu
把 WP_DEBUG 和 WP_DEBUG_LOG 都设成 true,刷新页面,wp-content/debug.log 还是不存在。我第一次碰上以为是目录权限,chmod 了整层,白折腾。
后来发现是我把 define 写到了主题的 functions.php 里。位置错了,什么都白搭。
常量得在 wp-config.php 里,而且时间要早
原因不复杂。wp_debug_mode() 在 wp-settings.php 很靠前的位置就被调用了,它才去读这几个常量。主题的 functions.php 加载得比这晚得多——那时候开关已经关过了,你再 define 也没人回头看。
<?php
// wp-config.php,放在 /* That's all, stop editing! */ 那行上面
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
define( 'SCRIPT_DEBUG', true );
WP_DEBUG_DISPLAY 我一般设 false,不然警告直接糊在页面上,把本来要看的东西挤没了。日志里看更清爽。
还有个小细节:WP_DEBUG_LOG 我记得某个版本之后支持直接写一个路径,不一定是 true。但我没细查是哪个版本起的,线上环境建议还是老老实实 true,省得猜。
文件建出来了,但一直是空的
这个更常见,七八成不是 WordPress 的锅。几种情况我都撞过:
wp-content 不可写。这时候 WordPress 不会报错,它就是静静地放弃写日志——我一度以为调试功能坏了。
你开的是多站点,日志在主站目录,但你在子站目录里翻。wp-content/debug.log 的路径是按主站算的,这个很容易绕进去。
还有就是,你期待的那条错误根本不是 PHP 警告,是 JavaScript 报错。那当然不会进 debug.log。我承认这个说法有点蠢,但我确实为此浪费过一个下午。
想在主题里插一句,用 error_log 更直接
error_log() 走的是 PHP 自己的日志通道,跟 WP_DEBUG_LOG 不是同一回事。WP_DEBUG_LOG 关了它也照写,取决于 php.ini 里 error_log 的配置。
// functions.php
add_action( 'wp_footer', function () {
error_log( 'footer 跑到这里了,query 数:' . get_num_queries() );
} );
临时插一段,看它到底有没有执行到,比开全套调试常量快。用完记得删——这玩意儿留在线上的话,日志会涨得挺快。
我现在的做法
站点根目录放一个 wp-config-local.php,所有调试开关都塞进去,主配置文件里只留一行 include:
// wp-config.php 最上面,<?php 之后
if ( file_exists( __DIR__ . '/wp-config-local.php' ) ) {
include __DIR__ . '/wp-config-local.php';
}
好处是不用每次改主配置,也不怕把调试开关误传到线上。顺手把这个文件写进 .gitignore。
说到底,WP_DEBUG_LOG 不生效这事,九成是 define 写错了地方。剩下的那一成,先去确认 wp-content 到底能不能写。