Duke Yin's Technology database

WordPress 将Debug写入文件

在wp-config中打开debug后,出错会直接显示在前端,但这会影响成品站点的用户体验,添加如下两个定义后可以不显示在前端,并且记录在wp-content/debug.log中。

define( 'WP_DEBUG_LOG', true ); 
define( 'WP_DEBUG_DISPLAY', false );

但是由于WordPress内核本身年代久远,如果你使用新的PHP版本比如8,log将会记录大量由WordPress本身造成的deprecated的提示,虽然官方文档针对log的等级可以用如下来设置:

error_reporting( E_ALL & ~E_DEPRECATED );

但是由于wp-config加载比较靠前,错误报告设置极大可能会被后面的某一些项给改写。我尝试过在新安装的WordPress中,剔除Depreacated信息都是不起作用的。

所以有了如下解决方案:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
$GLOBALS['wp_filter'] = array(
'enable_wp_debug_mode_checks' => array(
10 => array(
array(
'accepted_args' => 0,
'function'      => function () {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
// *** This is the key line - change to adjust to whatever logging state you want
error_reporting( E_ALL & ~E_DEPRECATED );
ini_set( 'display_errors', defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ? 1 : 0 );
if ( in_array( strtolower( (string) WP_DEBUG_LOG ), array( 'true', '1' ), true ) ) {
$log_path = WP_CONTENT_DIR . '/debug.log';
} elseif ( is_string( WP_DEBUG_LOG ) ) {
$log_path = WP_DEBUG_LOG;
} else {
$log_path = false;
}
if ( $log_path ) {
ini_set( 'log_errors', 1 );
ini_set( 'error_log', $log_path );
}
if (
defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || defined( 'MS_FILES_REQUEST' ) ||
( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) ||
wp_doing_ajax() || wp_is_json_request() ) {
ini_set( 'display_errors', 0 );
}
}
return false;
},
),
),
));

使用wp_filter去处理,不会被覆写,有多种情况处理,log文件不记录depracated信息,甚至你可以根据自己的需求去编辑log等级。

发布评论

评论

标注 * 的为必填项。