所有 WordPress开发者都会花费大量时间用来调试代码,有时候,代码并不会报出明显的错误,我们查错只能靠猜。特别是 WordPress 接收 POST 请求的时候,程序没有返回数据到前端,当程序出错时,我们需要知道程序报出的错误信息是什么或者返回了什么数据。以前,我们的做法是记录程序的返回数据到数据库里面,这种做法查看数据很不方便,效率一直较低,直到我们发现了 Wonolog 库,Wonolog 集成了 PHP 世界中最流行的日志工具 Monolog 到 WordPress 的一个工具。
使用 Wonolog,我们可以捕获网站上所有的 PHP 和数据库错误,警告和通知。通过使用 Monolog 的一些错误处理程序,我们可以将错误写入日志文件,或者通过电子邮件发送给管理员。有了这个工具,再进行 WordPress开发时,我们就可以非常轻松的记录和查看程序调试信息了。
怎么使用 Wonolog 记录 WordPress 调试信息
如果我们使用 Composer 管理我们的依赖, 直接通过 Composer 安装 Wonolog 到我们的程序中:
composer require inpsyde/Wonolog
使用之前我们需要通过以下代码启动 Wonolog:
\Inpsyde\Wonolog\bootstrap()
记录的信息内容可以通过 WP_DEBUG_LOG
常量控制,如果设置为 true,Wonolog 将会记录所有警告、错误、或其他调试信息,如果设置为 false,Wonolog 将会记录错误信息。
记录调试日志到文件
如果我们在 WordPress开发的过程中需要手动记录一些信息到日志中,我们可以直接通过 Wonolog 提供的 Action 把信息插入日志文件即可。
do_action( 'wonolog.log', [
'message' => 'Something happened.',
'channel' => 'DEBUG',
'level' => 100,
'context' => [],
] );
默认的日志文件的保存路径为:wp-content/wonolog/{Y/m/d}.log,我们可以直接打开对应的文件查看日志信息。
严重错误时发送邮件通知
默认情况下,Wonolog 通过一个 Monolog Handler 将消息记录到文件,程序发生严重错误的时候,我们需要让管理员及时得到通知,Monolog 拥有大量预设的的日志处理程序,我们可以将所有或部分错误发送到另一个位置。首先,我们需要设置一个自定义处理程序,Monolog 有一个本地电子邮件处理程序,使用 PHP 的邮件功能发送电子邮件。
Wonolog 的引导函数返回 Wonolog\Controller 类的一个实例,我们可以添加额外的处理程序。我们可以使用该类的 use_handler()
, 方法添加一个额外的处理程序,例如 NativeMailerHandler:
use Monolog\Logger;
use \Monolog\Handler\NativeMailerHandler;
$email_handler = new NativeMailerHandler(
'you@example.com',
'Error on ' . home_url(),
'logs@example.com',
Logger::ERROR
);
\Inpsyde\Wonolog\bootstrap( )->use_handler( $email_handler );
Monolog 的 NativeMailerHandler 使用函数 mail()
发送电子邮件。在WordPress中,我们通常使用 wp_mail()
,它默认使用 PHP Mailer,但是经常被替换。为了更好的兼容性,我们可以扩展 NativeMailerHandler 和覆盖它的 send()
方法来替代使用 wp_mail()
。
namespace Example;
use Monolog\Formatter\LineFormatter;
use \Monolog\Handler\NativeMailerHandler;
class WPMailHanlder extends NativeMailerHandler {
/**
* {@inheritdoc}
*/
protected function send(string $content, array $records)
{
$content = wordwrap($content, $this->maxColumnWidth);
$headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n");
$headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n";
if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) {
$headers .= 'MIME-Version: 1.0' . "\r\n";
}
$subject = $this->subject;
if ($records) {
$subjectFormatter = new LineFormatter($this->subject);
$subject = $subjectFormatter->format($this->getHighestRecord($records));
}
foreach ($this->to as $to) {
wp_mail($to, $subject, $content, $headers);
}
}
}
然后,我们就可以通过下面的代码, 直接使用 WordPress 默认的 wp_mail 函数来发送错误信息了。
use Monolog\Logger;
use \Monolog\Handler\NativeMailerHandler;
use Example;
$email_handler = new WPMailHanlder(
'you@example.com',
'Error on ' . home_url(),
'logs@example.com',
Logger::ERROR
);
\Inpsyde\Wonolog\bootstrap( )->use_handler( $email_handler );
除了发送邮件,Monolog 内置或第三方的日志处理程序我们都可以使用,比如,我们可以发送错误信息到 Slack,Papertrail 等。
有了详尽的日志记录,在开发 WordPress 应用程序的时候,我们就可以很方便的记录查看应用程序的每一步操作了,信息了解的越清楚,我们就越胸有成竹。除了记录错误信息,在对于电子商务类型等涉及到金钱教育的网站,我们还可以把交易信息记录到日志里面,方便交易金额对不上的时候查询每一步交易。
关于 "使用 WONOLOG 记录 WordPress bug 调试信息 "的一个想法
测试邮件评论。