业务错误怎么查,我用云开发高级日志服务
小程序·云开发作为小程序原生的后台开发能力,一直致力于可以更高效地帮助开发者构建性能更好的小程序。而云函数作为云开发的一项基础能力,承载着小程序所有的后台运算逻辑,它就像小程序的大脑一样,每天繁忙地工作着。
而对于开发者而言,如何尽快地定位和排查云函数使用过程中的问题,也成为保障小程序质量的必备功能。而有一部分开发者并不担心这个问题,因为他们选择了一种能力,只要通过简单的开启就可以高效且准确地定位到云函数中的问题。
这就是云开发提供的高级日志服务。那什么是高级日志服务,它又能做什么呢?接下来就让我们一探究竟。
什么是高级日志服务
很多开发者可能都会遇到这样一些问题:
线上的小程序运行地好好的突然出问题了,怎么知道是哪里有异常呢?
根据线上表现大概猜到是哪个功能模块出现了异常,但是不知道上下文调用信息,要如何准确定位问题?
如果你恰巧使用的是云开发,那不必担心,因为云函数原生就带有日志服务。但是基于之前提供的旧的日志服务,开发者可能还是会遇到一些问题:
我不知道具体的请求 ID 是什么,但是隐约记得一些关键字,这要怎么查询日志信息啊?
我想自定义一些信息打印到日志中,该怎么办?
小程序·云开发的高级日志服务就是为解决以上所有开发者遇到的问题应运而生的产品能力。基于高级日志服务提供的日志采集和日志检索功能,开发者可以更加高效地发现和解决云函数运行过程中的问题。
高级日志服务能做什么
让我们通过前端开发小 H 的故事来看看,高级日志服务到底能够做什么。
1. 旧框架下的日志服务
之前小 H 经常会为了做小程序而陷入苦恼当中,比如他需要将用户触发订阅消息时的一些数据存储到数据库中,用于后续的消息下发,这就需要有一个完整的服务端才行。但是作为一个前端开发,小 H 对于后台服务的搭建和部署并不熟悉,因此常常陷入困境。
后来他发现了云开发这样一个神器,一键开通就可以具备后台服务开发的能力了。那么现在当他想要存储相关的数据就变得非常简单了。
首先,他定义一个云函数 subscribe
,并在通过该云函数将用户订阅的消息信息存储到小程序·云开发的数据库中。
exports.main = async (event, context) => {
try {
const { OPENID } = cloud.getWXContext();
// 在数据库中记录用户的订阅信息
const result = await db.collection('messages').add({
data: {
touser: OPENID, // 用户的openid
page: 'index', // 订阅消息的页面路径
templateId: event.templateId, // 订阅消息模板ID
},
});
return result;
} catch (err) {
console.log(err);
return err;
}
}
然后在小程序端调起订阅消息界面的时候触发这个云函数并将对应的信息存储到数据库中。同时小 H 还可以通过云开发提供的原生的日志功能查看每次的调用是否成功,以及具体的调用信息。
但是原生的日志中能够写入的数据是非常有限的。而且检索日志的时候只能通过开始时间、结束时间、状态和 requestID
进行检索。可是基于业务需求小 H 需要在 subscribe
云函数调用的时候需要再打入一些自定义的信息,而且他希望可以对日志按照 log
/ info
/ warn
/ error
进行分级,这样在日志查询的时候也可以快速定位到自己想要关注的日志,这该怎么办呢?
当然,小 H 并不只是一个人,正是看到很多开发者有类似的问题,今年我们推出了云开发高级日志的服务。接下来,让我们看看,小 H 是如何使用高级日志服务的。
2. 高级日志服务
首先,小 H 在定义 subscribe
函数的时候可以使用 wx-server-sdk
(1.5.0 或以上版本)提供的方法打入一些自定义的日志内容。具体流程为:
- 通过
logger()
方法取得log
对象 - 调用
log
对象上的log
/info
/warn
/error
(对应不同 level 的日志等级)方法,传入一个对象作为参数 - 对象的每一个
<key, value>
对都会成为日志一条记录中的一个可检索的键值对,其中value
不论值是什么都会被转成字符串
按照上述改造后, subscribe
变成了下面这样:
exports.main = async (event, context) => {
const log = cloud.logger();
try {
const { OPENID } = cloud.getWXContext();
// 在数据库中记录用户的订阅信息
const result = await db.collection('messages').add({
data: {
touser: OPENID, // 用户的openid
page: 'index', // 订阅消息的页面路径
templateId: event.templateId, // 订阅消息模板ID
},
});
log.info({
action: 'addMessage',
touser: OPENID,
templateId: event.templateId,
});
return result;
} catch (err) {
log.error({
type: err.name,
message: err.message,
});
return err;
}
}
此时,当这个 subscribe
被触发以后,我们就能在高级日志服务中看到这样一条日志记录:
{
"level": "info",
"function": "<function_name>", // 执行的云函数名
"requestId": "<request_id>", // Request ID
"action": "addMessage",
"touser": "<openid>",
"templateId": "<template_id>",
"src": "app" // logger 打的日志为 app,系统打的日志为 system
}
有了日志以后,日志检索也会变得非常的简单。高级日志不仅提供了全文检索能力,还提供了通过键值检索约束查询范围,让日志的检索变得更加的简单和快捷。
比如,小 H 想知道 subscribe
函数的日志,就可以通过:
- 全文检索:在搜索框中输入
subscribe
- 键值检索:在搜索框中输入
function:subscribe
比如,小 H 想知道 subscribe
函数且 OPENID 为 popo
的日志,就可以通过:
- 在搜索框中输入
function:subscribe and touser:popo
又如,小 H 想知道 level 为 error
且错误信息中含有单词 defined
或以 mem
打头的单词的日志,就可以通过:
- 在搜索框中输入
function:subscribe and level:error and (message:defined or message:mem*)
当然,高级日志服务还提供丰富的查询语法,大家可通过《小程序·云开发高级日志服务》了解详细内容。
除了新增的高级日志外,近期小程序·云开发还更新了——
小程序·云开发能力更新
除了新增的高级日志外,近期小程序·云开发还更新了:
- 为帮助企业、政府、媒体及其他组织的小程序开发者在新冠肺炎疫情期间共度难关,小程序·云开发推出特殊类型代金券帮助大家以更低地资源成本完成小程序的功能迭代。详情可参考文档《小程序·云开发特殊代金券》
- 数据库安全规则:提供精细化的控制集合中所有记录的读、写权限的能力,自动拒绝不符合安全规则的前端数据库请求,保障数据安全
- 自定义告警:提供更加灵活的告警配置,可以使用告警指标、统计周期、比较条件、持续周期、告警频率等参数自由组合告警条件。如:统计周期 [5 分钟],当 [云函数错误次数] [>] [5 次] 且持续 [1] 个周期时告警,[每小时] 告警一次
- 数据库事务:可以方便开发者更加灵活地使用数据库能力,满足跨多个记录或跨多集合的原子操作的使用诉求,极大地方便了小程序的功能开发