关键词搜索

源码搜索 ×
×

如何自动收到错误报警?

发布2021-07-19浏览349次

详情内容

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

场景复现

  • 客户端:后端接口报错了,我解析数据失败,你看看为啥?
  • 服务端:好,我查查log。你把请求参数给我打印出来。
  • 客户端:我咋打印?
  • 服务端:…我还是自己查log吧

image.png

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

分析

  • 不管哪个语言做服务端开发,一定有异常处理和日志。
  • 找到一个三方平台,当捕获到异常或者有新的打印日志时回调,推送错误日志给我们。
  • 经过一番调研之后,发现钉钉的机器人是个好工作

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

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

image.png

修改日志配置

<?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
                    ]
                ]);
        }
    }
    
    
      39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    部署上线的效果

    image.png

    再也不用爬日志啦!

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

    此处放一个机智的表情

    image.png

    欢迎大家评论点赞关注。大佬们给我来个一键三连吧

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载