返回

Serverless 日志报警,通过页面 JS 错误及时发现问题!

前端

Serverless 日志报警,开启实时监控新篇章

在应用开发和运维过程中,日志是排查故障和优化系统性能的重要依据。然而,传统日志管理系统往往存在成本高、运维复杂等问题,严重制约了企业数字化转型进程。

Serverless 架构的兴起为日志管理带来了新的解决方案。Serverless 日志报警服务通过无服务架构,可以帮助企业快速、轻松地实现日志的实时采集、存储和分析,并及时发现和处理潜在问题。

实践案例:页面 JS 错误报警

最近,我尝试将应用的页面 JS 错误报警功能通过 Serverless 来实现。本文主要介绍一下具体实现过程,以及遇到的一些问题和解决方案。

报警需求

报警功能的需求也很简单,就是定时(如每隔 1 分钟)去读取 ARMS 的错误日志,如果有错误日志,则通过钉钉消息发送错误详情进行报警。

实现方案

  1. 创建 Serverless 应用

首先,我们需要创建一个 Serverless 应用。可以在阿里云控制台或命令行工具中创建。

  1. 安装依赖

接下来,我们需要安装必要的依赖。

npm install --save serverless
npm install --save ali-oss
npm install --save axios
  1. 编写代码

然后,我们需要编写代码。

const serverless = require('serverless-http');
const OSS = require('ali-oss');
const axios = require('axios');

const app = serverless(handler);

async function handler(event, context) {
  // 创建 OSS 客户端
  const ossClient = new OSS({
    region: 'cn-hangzhou',
    accessKeyId: process.env.OSS_ACCESS_KEY_ID,
    accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    bucket: 'my-bucket',
  });

  // 读取错误日志
  const logFile = await ossClient.get('error.log');
  const logText = logFile.content.toString();

  // 解析错误日志
  const errors = logText.split('\n').filter(line => line.includes('error'));

  // 发送钉钉消息
  if (errors.length > 0) {
    const钉钉消息= {
      "msgtype": "text",
      "text": {
        "content": `发现 ${errors.length} 个页面 JS 错误,详情如下:\n${errors.join('\n')}`
      },
      "at": {
        "isAtAll": false
      }
    };
    await axios.post('https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN', 钉钉消息);
  }

  return {
    statusCode: 200,
    body: 'OK',
  };
}
  1. 部署应用

最后,我们需要部署应用。

serverless deploy

遇到的问题和解决方案

1. CORS 问题

在开发过程中,我遇到了 CORS 问题。这是因为钉钉消息发送请求时,会带上 CORS 头。解决方法是,在 Serverless 函数中添加以下代码:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  next();
});

2. 钉钉消息发送失败

在部署应用后,我发现钉钉消息发送失败。这是因为钉钉消息发送请求时,需要带上签名。解决方法是,在 Serverless 函数中添加以下代码:

const crypto = require('crypto');

const signature = crypto.createHmac('sha256', process.env.DINGTALK_SECRET)
  .update(new Date().getTime().toString())
  .digest('base64');

const钉钉消息= {
  "msgtype": "text",
  "text": {
    "content": `发现 ${errors.length} 个页面 JS 错误,详情如下:\n${errors.join('\n')}`
  },
  "at": {
    "isAtAll": false
  },
  "sign": signature
};

结语

通过以上步骤,我成功实现了 Serverless 日志报警功能。这个功能可以帮助我及时发现和处理页面 JS 错误,从而提高应用的稳定性和可靠性。

Serverless 日志报警服务是一种非常实用的工具,可以帮助企业轻松实现日志的实时采集、存储和分析。如果您正在寻找一种简单、高效的日志管理解决方案,那么 Serverless 日志报警服务是一个非常不错的选择。