制作一个 BearyChat 的 Laravel 项目错误日志通知机器人
13

本文最早发表于本人博客: 制作一个BearyChat的Laravel项目错误日志通知机器人

Laravel 集成 Monolog 来做日志处理,Monolog非常强大,也容易扩展,其实它本身已经支持很多Handler了,你可以把日志发送到邮件或者其他日志收集服务器或者系统中,因为我们团队使用Bearychat 作为团队沟通工具,所以把Laravel项目的实时错误日志推送到Bearychat的一个讨论组中,方便组员迅速发现异常和解决问题 ,其实很简单没多少行代码就搞定了。

  • 首先创建BearyChatHandler
<?php
namespace App;

use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;
use Monolog\Handler\Curl;

class BearyChatHandler extends AbstractProcessingHandler
{
    private $data;
    private $webhook;

    public function __construct($webhook, $channel, $level = Logger::NOTICE, $bubble = true)
    {
        $this->data['channel'] = $channel;
        $this->webhook = $webhook;
        parent::__construct($level, $bubble);
    }

    /**
     * {@inheritDoc}
     */
    protected function write(array $record)
    {
        $postData = [
            'text' => $record['datetime']->format('Y-m-d H:i:s') . '-' . $record["level"] . '-' . $record["level_name"],
            'markdown' => false,
            'notification' => 'Laravel Error Log',
            'attachments' => [
                [
                    'title' => current(preg_split("/([.\n\r]+)/i", $record['message'])),
                    'text' => $record['message'],
                    'color' => '#ffa500'
                ]
            ]
        ];
        $postString = json_encode(array_merge($this->data, $postData));
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->webhook);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json"
        ));

        Curl\Util::execute($ch);
    }

}

只要继承AbstractProcessingHandler,重写write方法就可以了,write中向Bearychat的webhook地址POST数据就可以了,$recordMonolog记录日志的详情

  • 创建一个BearyChat组用来接受通知

    • 新建讨论组,比如叫"Laravel错误日志报告"
    • 添加机器人到讨论组,点击Incoming添加一个比如叫"Laravel日志机器人",发送目标选择上一步建的"Laravel错误日志报告",这样就获取了webhook的URL地址了
    • 把相应的人员加到这个讨论组
  • 集成ChearyChatHandler

官方手册上讲到,你像这样完全控制Monolog

Custom Monolog Configuration

If you would like to have complete control over how Monolog is configured for your application, you may use the application's configureMonologUsing method. You should place a call to this method in your bootstrap/app.php file right before the $app variable is returned by the file:

$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});

return $app;

但是我们除了发送到ChearyChat以外还要保留默认的记录到log文件的方式,所以我们不这样做,我们只要在 Exception Handler的地方添加一个我们的ChearyChatHandler就可以了。

修改app/Exceptions/Handler.php,在report方法中添加如下代码就可以了:

<?php

namespace App\Exceptions;

use App\BearyChatHandler;
......
use Log;

class Handler extends ExceptionHandler
{
   ......
    public function report(Exception $e)
    {
        $monolog = Log::getMonolog();
        $monolog->pushHandler(new BearyChatHandler('https://yourhookurl','Laravel日志机器人'));

        return parent::report($e);
    }
......
}

好了,在代码中故意写个错误,看看BearyChat收到错误日志了。

转载请注明: 转载自Ryan是菜鸟 | LNMP技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
Alex89

多谢分享 :+1:

2年前
Ryan

@Alex89 :smile:

2年前

文章写的很好 但是我想问的就是怎么能获取到错误的行号和文件名呢?

8个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!