如何第一时间收到接口报错?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 不管哪个语言做服务端开发,一定有异常处理和日志。找到一个三方平台,当捕获到异常或者有新的打印日志时回调,推送错误日志给我们。经过一番调研之后,发现钉钉的机器人是个好工作

场景复现


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


分析


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


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


修改日志配置


<?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
                ]
            ]);
    }
}


部署上线的效果


微信图片_20221111203621.jpg


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
Arthas 前端开发 Java
问题排查---应用程序不在接收新请求
关键词:springboot,jstack,Arthas
118 1
|
3月前
|
机器学习/深度学习 人工智能 缓存
函数计算产品使用问题之在第一次启动时请求外部接口总是超时,是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
登录接口梳理(如何看接口发出那些请求)
登录接口梳理(如何看接口发出那些请求)
支付系统34----支付成功异步通知,处理重复通知,我们在我们程序当中找到处理订单的processOrder方法,我们要在更新订单状态和记录日志之前,先处理重复通知
支付系统34----支付成功异步通知,处理重复通知,我们在我们程序当中找到处理订单的processOrder方法,我们要在更新订单状态和记录日志之前,先处理重复通知
|
5月前
|
移动开发 小程序 JavaScript
mPaas 问题之参数收不到如何解决
mPaaS小程序是阿里巴巴移动平台服务(mPaaS)推出的一种轻量级应用解决方案,旨在帮助开发者快速构建跨平台的小程序应用;本合集将聚焦mPaaS小程序的开发流程、技术架构和最佳实践,以及如何解决开发中遇到的问题,从而助力开发者高效打造和维护小程序应用。
|
Linux
设置socket接收和发送超时的一种方式
设置socket接收和发送超时的一种方式
681 0
|
SQL 监控 JavaScript
接口突然超时10宗罪。。。
接口突然超时10宗罪。。。
|
消息中间件 Java RocketMQ
发送确认订单失败消息演示|学习笔记
快速学习发送确认订单失败消息
发送确认订单失败消息演示|学习笔记
|
存储 安全 网络协议
WCF服务调用超时错误:套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:05:30”(已解决)
WCF服务调用超时错误:套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:05:30”(已解决)
633 0