前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何及时收到接口的报错?每次客户端说接口报错了去爬日志debug是不是很烦?

如何及时收到接口的报错?每次客户端说接口报错了去爬日志debug是不是很烦?

作者头像
王中阳Go
发布2022-10-26 14:01:28
6780
发布2022-10-26 14:01:28
举报
文章被收录于专栏:Go语言学习专栏

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

场景复现

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

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

分析

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

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

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

修改日志配置

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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
                ]
            ]);
    }
}

部署上线的效果

再也不用爬日志啦!

测试妹子再找我说可能接口挂了,我也可以马上硬气的=回答:”应该是客户端解析问题,服务端没收到报错。“

此处放一个机智的表情

参考文档

  • 日志相关参考文档 laravel中文文档 日志篇
  • 钉钉相关参考文档 钉钉机器人文档
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级打怪之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景复现
  • 分析
  • 修改日志配置
  • 自定义Handler
  • 部署上线的效果
  • 参考文档
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档