使用 WONOLOG 记录 WordPress bug 调试信息

使用 WONOLOG 记录 WordPress bug 调试信息

使用 WONOLOG 记录 WordPress bug 调试信息

所有 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 应用程序的时候,我们就可以很方便的记录查看应用程序的每一步操作了,信息了解的越清楚,我们就越胸有成竹。除了记录错误信息,在对于电子商务类型等涉及到金钱教育的网站,我们还可以把交易信息记录到日志里面,方便交易金额对不上的时候查询每一步交易。

本站提供 WordPress 主题定制开发服务

本站长期承接WordPress主题、插件、基于 WooCommerce 的商店商城开发业务。 我们有7年 WordPress 开发经验, 如果你想用 WordPress 开发网站, 请联系 QQ: 470266798 或邮箱: 4626395@gmail.com 咨询。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*