返回
Serverless 日志报警,通过页面 JS 错误及时发现问题!
前端
2023-11-12 23:48:48
Serverless 日志报警,开启实时监控新篇章
在应用开发和运维过程中,日志是排查故障和优化系统性能的重要依据。然而,传统日志管理系统往往存在成本高、运维复杂等问题,严重制约了企业数字化转型进程。
Serverless 架构的兴起为日志管理带来了新的解决方案。Serverless 日志报警服务通过无服务架构,可以帮助企业快速、轻松地实现日志的实时采集、存储和分析,并及时发现和处理潜在问题。
实践案例:页面 JS 错误报警
最近,我尝试将应用的页面 JS 错误报警功能通过 Serverless 来实现。本文主要介绍一下具体实现过程,以及遇到的一些问题和解决方案。
报警需求
报警功能的需求也很简单,就是定时(如每隔 1 分钟)去读取 ARMS 的错误日志,如果有错误日志,则通过钉钉消息发送错误详情进行报警。
实现方案
- 创建 Serverless 应用
首先,我们需要创建一个 Serverless 应用。可以在阿里云控制台或命令行工具中创建。
- 安装依赖
接下来,我们需要安装必要的依赖。
npm install --save serverless
npm install --save ali-oss
npm install --save axios
- 编写代码
然后,我们需要编写代码。
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',
};
}
- 部署应用
最后,我们需要部署应用。
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 日志报警服务是一个非常不错的选择。