继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

如何第一时间收到接口报错?不用测试妹子再质疑你是不是接口挂了。

慕田峪4524236
关注TA
已关注
手记 204
粉丝 19
获赞 51

啥样的后端程序员是好程序员?能机器做的事绝不自己做,哈哈。

场景复现

  • 客户端:后端接口报错了,我解析数据失败,你看看为啥?

  • 服务端:好,我查查log。你把请求参数给我打印出来。

  • 客户端:我咋打印?

  • 服务端:....我还是自己查log吧

http://img1.sycdn.imooc.com/60ff4ddb0001ab1102550255.jpg

以上这种场景在开发中是不是时有发生?是不是很难顶?有啥好办法让debug更智能一点吗?

分析

  • 不管哪个语言做服务端开发,一定有异常处理和日志。

  • 找到一个三方平台,当捕获到异常或者有新的打印日志时回调,推送错误日志给我们。

  • 经过一番调研之后,发现钉钉的机器人是个好工作

说干就干,刷文档,写实现。

后端实现以PHP的Laravel为例,其他语言也可以借鉴思路。

http://img4.sycdn.imooc.com/60ff4ddc0001ba3303000278.jpg

修改日志配置

<?php


use Monolog\Handler\NullHandler;

use Monolog\Handler\StreamHandler;

use Monolog\Handler\SyslogUdpHandler;


return [


    'default' => env('LOG_CHANNEL', 'stack'),


    'channels' => [

        'stack' => [

            'driver' => 'stack',

            //测试环境除了使用daily保存每天日志到logs/laravel.log,还使用’dingding‘channel

            'channels' => env("APP_ENV") == 'test' ? ['daily', 'dingding'] : ['daily'],

            'ignore_exceptions' => false,

        ],

        //配置钉钉 驱动选择 monolog 

        'dingding' => [

            'driver' => 'monolog',

            'level' => 'error',

            'handler' => \App\Handler\DingdingLogHandler::class,  //自定义handler

        ],


        'daily' => [

            'driver' => 'daily',

            'path' => storage_path('logs/laravel.log'),

            'level' => 'debug',

            'days' => 14,

        ],

  

        .

        .

        .

    ],


];


上面不重要的代码使用3个竖向排列的.省略显示。

自定义Handler

<?php

namespace App\Handler;


use App\Library\CurlRequest;

use App\Library\Utility;

use Monolog\Logger;

use Monolog\Handler;


class DingdingLogHandler extends Handler\AbstractProcessingHandler

{

    private $apiKey;

    private $channel;


    public function __construct(

        $level = Logger::DEBUG,

        bool $bubble = true

    ) {

        parent::__construct($level, $bubble);



    }


    protected function write(array $record): void

    {

        $this->send($record['formatted']);

    }



    protected function send(string $message): void

    {

        $microSecond = Utility::getMicroSecond();

        $key = "xxxx";

        $hashString = hash_hmac("sha256", $microSecond ."\n" . $key, $key, true);

        $sign = urlencode(base64_encode($hashString));


        CurlRequest::post("https://oapi.dingtalk.com/robot/send?access_token=xxxxx&timestamp=".$microSecond."&sign=".$sign,

            [

                "msgtype" => "text",

                "at" => [

                    "atMobiles" => [

                        "xxxx",

                        "xxxx"

                    ]

                ],

                "text" => [

                    "content" => $message

                ]

            ]);

    }

}


部署上线的效果

http://img2.sycdn.imooc.com/60ff4e10000151d408900829.jpg

再也不用爬日志啦!

测试妹子再找我说客户端报错数据解析错误,我也能马上硬气的回答:”应该是客户端解析问题,服务端没收到报错。“

此处放一个机智的表情

http://img2.sycdn.imooc.com/60ff4e110001e07607000700.jpg


作者:王中阳Go


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP