跳转至

小程序日志采集

小程序 Logs SDK 用于向 观测云 发送业务日志,并自动采集控制台、运行时和网络错误。日志写入 browser_log 来源,可在日志查看器中检索;与 MiniApp RUM SDK 配合使用时,可关联应用、会话、页面和用户信息。

本文按 SDK 1.0.6 说明接入方式与行为。版本变化见 SDK 更新日志。

开始使用

1. 安装与引入

推荐通过 npm 安装,使用 datafluxLogs 入口:

npm install @cloudcare/dataflux-rum-miniapp-logs

在应用入口引入 SDK,并在业务日志和请求发生前完成初始化。使用原生小程序开发工具时,按工具要求完成 npm 构建。

const { datafluxLogs } = require('@cloudcare/dataflux-rum-miniapp-logs')

也可以下载 SDK 文件,放入小程序项目后从本地路径引入。以下路径应按文件实际位置调整:

const { datafluxLogs } = require('./dataflux-rum-miniapp-logs.js')

SDK 自动选择可用的 wx、my、swan、tt 或 uni 请求接口,分别适配微信、支付宝、百度、抖音和 uni 宿主;多个接口同时存在时按上述顺序选择。使用 uni 工程时,应在小程序端代码中引入和初始化。设备、网络、存储或生命周期接口缺失时独立降级;没有可用请求接口时不采集日志,并输出初始化提示。

SDK 运行于小程序宿主,安装包不设置 engines.node 限制。Node.js 仅用于开发阶段的构建、测试和发布工具,其版本需满足对应开发依赖的要求。

2. 初始化

选择一种上报方式,在应用生命周期内初始化一次。上报地址必须可从小程序访问,并按目标平台要求配置请求域名。

配置可访问的 DataKit 地址。datakitOrigin 填写协议、域名或 IP,以及可选端口,不要附加 /v1/write/logging。

datafluxLogs.init({
  datakitOrigin: 'https://datakit.example.com',
  applicationId: '<APPLICATION_ID>',
  service: 'miniapp',
  env: 'prod',
  version: '1.0.0'
})

applicationId 用于标识应用,可按需填写。DataKit 部署与网络配置见 DataKit 工具说明。

从 观测云 控制台获取站点地址和客户端令牌,配置 site 与 clientToken。此方式无需填写 datakitOrigin。

datafluxLogs.init({
  site: '<PUBLIC_DATAWAY_URL>',
  clientToken: '<CLIENT_TOKEN>',
  applicationId: '<APPLICATION_ID>',
  service: 'miniapp',
  env: 'prod',
  version: '1.0.0'
})

重复调用 init() 不会更新配置。silentMultipleInit: true 仅关闭重复初始化提示。

3. 发送并查看日志

初始化后,在同一模块使用 datafluxLogs;其他页面可按前述方式引入同一个 SDK 模块。

datafluxLogs.logger.info('应用启动', { entry: 'home' })
datafluxLogs.logger.warn('库存不足', { product_id: 'product-123' })
datafluxLogs.logger.error('支付失败', { order_id: 'order-123' })

日志按批次发送,默认每 30 秒尝试发送一次;达到批次阈值或应用进入后台时也会触发发送。进入日志查看器,按来源 browser_log、service、日志正文或自定义字段检索。

配置

初始化参数

参数 类型 默认值 说明
datakitOrigin String — DataKit 上报地址;使用 DataKit 时与 datakitUrl 至少提供一个,优先使用本参数。
datakitUrl String — datakitOrigin 的兼容别名。
site String — 公网 DataWay 上报地址;使用公网 DataWay 时必填。
clientToken String — 公网 DataWay 客户端令牌;与 site 配合使用,不能为空。
applicationId String — 独立使用 Logs 时的应用 ID,对应 app_id;关联 RUM 时使用日志发生时刻的 RUM 应用上下文。
service String miniapp 日志所属服务名称。
env String 空字符串 应用环境,例如 prod、pre、local。
version String 空字符串 业务应用版本号,区别于 SDK 包版本。
sampleRate Number 100 HTTP 日志上报的会话采样率,取值为 0–100。0 表示不上报,100 表示全量上报。
forwardErrorsToLogs Boolean true 是否自动采集控制台、运行时和网络错误;设为 false 不影响手动日志 API。
rumIntakeUrls String[] [] 可选。额外排除自动网络错误采集的完整 RUM 上传 URL,用于 RUM 和 Logs 使用不同采集地址的情况。
silentMultipleInit Boolean false 是否关闭重复初始化提示;不改变初始化结果。

除所选上报方式要求的地址和令牌外,其他参数均可选。采样在 SDK 初始化时确定,同一运行实例内沿用该结果,并非每条日志独立随机采样。

从 1.0.6 起,移除未实现的初始化选项 tags、trackInteractions、allowedTracingOrigins、traceId128Bit 和 traceType。自定义字段改用上下文 API;交互与链路采集在 RUM SDK 中配置。

使用

日志等级

默认 Logger 为 datafluxLogs.logger,默认等级为 debug,默认通过 HTTP 上报。可直接调用对应方法:

方法 日志 status 用途示例
logger.debug(message, context) debug 调试信息。
logger.info(message, context) info 业务事件和运行信息。
logger.warn(message, context) warning 可恢复的异常或业务告警。
logger.error(message, context) error 业务失败或错误。
logger.critical(message, context) critical 严重错误。

message 为字符串,context 是可选的字段对象。也可以使用 log(message, context, status) 显式指定等级;省略 status 时为 info。注意 warn() 对应的状态值是 warning:

datafluxLogs.logger.log('库存不足', { product_id: 'product-123' }, 'warning')

使用 setLevel() 设置最低等级,低于该等级的日志不输出。等级顺序为 debug → info → warning → error → critical:

datafluxLogs.logger.setLevel('warning')

自定义 Logger

为不同业务模块创建 Logger,分别设置等级、输出方式和持久上下文:

const paymentLogger = datafluxLogs.createLogger('payment', {
  level: 'info',
  handler: 'http',
  context: { module: 'payment' }
})

paymentLogger.info('创建订单', { order_id: 'order-123' })

createLogger(name, configuration) 返回创建的 Logger;之后可通过 getLogger(name) 获取。未创建过的名称返回 undefined。configuration 中的 level、handler、context 都可省略,默认分别为 debug、http 和空对象。

使用 setHandler() 切换输出方式:

handler 行为
http 通过 SDK 批次上报日志。
console 调用 console.log,输出等级、正文及 Logger/单条日志上下文,不进行 HTTP 上报。
silent 不输出该 Logger 的日志。
const paymentLogger = datafluxLogs.getLogger('payment')
if (paymentLogger) {
  paymentLogger.setHandler('console')
}

自动采集的错误由默认 Logger 输出,因此修改 datafluxLogs.logger 的等级或输出方式,也会影响自动错误日志。命名 Logger 的设置只作用于该 Logger。

自定义字段

自定义字段可以放在全局上下文、Logger 上下文或单条日志上下文中。HTTP 上报时,同名自定义字段按全局 → Logger → 单条日志的顺序覆盖。

全局上下文作用于所有 Logger 的 HTTP 日志:

datafluxLogs.setLoggerGlobalContext({ tenant: 'example' })
datafluxLogs.addLoggerGlobalContext('region', 'cn')
const globalContext = datafluxLogs.getLoggerGlobalContext()
datafluxLogs.removeLoggerGlobalContext('region')

Logger 上下文只作用于对应 Logger:

datafluxLogs.logger.setContext({ team: 'payments' })
datafluxLogs.logger.addContext('channel', 'miniapp')
datafluxLogs.logger.removeContext('channel')

setLoggerGlobalContext() 和 setContext() 替换对应的整份上下文;add...Context() 添加或替换一个字段,remove...Context() 删除一个字段。获取全局上下文返回独立快照,修改返回对象不会修改 SDK 内部保存的数据。

单条日志上下文仅作用于本次调用:

datafluxLogs.logger.info('支付完成', {
  order_id: 'order-123',
  amount: 0,
  paid: true,
  customer: { id: 'customer-123' },
  items: ['product-123']
})

字段支持标量、对象和数组。0、false 等有效值会保留;对象和数组在上报时序列化为 JSON 字符串,BigInt 按精确十进制字符串发送。普通业务字段可以直接放在上下文根级,也兼容 tags: { ... } 写法;这里的 tags 最终仍作为自定义日志字段发送。

上下文采用独立快照。有 toJSON(key) 的对象会在原实例上按实际字段名完成序列化,再保存结果,支持带私有字段的脱敏器。普通字段的脱敏器失败时使用错误占位值,不回退到未脱敏原对象。

HTTP 日志的根上下文和嵌套 tags 只接受字典结果;无效结果被忽略并保留有效持久字段。设置持久上下文时,若根脱敏器失败或返回非字典,则重置为空字典。单条日志不会修改持久上下文。

业务字段应避免与 message、status、service 等标准字段同名;同名业务数据可放在 business 对象中。message 和 status 由日志调用参数决定,type 固定为 SDK 内部日志类型,不能通过上下文替换。

手动记录错误

logger.error() 接收正文和上下文。需要记录 Error 的堆栈时,将其明确放到 error.stack:

const error = new Error('支付接口超时')
datafluxLogs.logger.error(error.message, {
  order_id: 'order-123',
  error: { stack: error.stack }
})

手动错误默认上报 error_source=logger。单条日志显式传入的 error.source 可以覆盖默认来源;自动错误保留实际来源。

自动错误采集

默认开启,可通过 forwardErrorsToLogs: false 关闭。采集能力取决于宿主提供的 API:

来源 采集内容
控制台 console.error() 的正文和参数;不自动采集 console.log()、info() 或 warn()。
运行时 宿主错误事件、未处理 Promise 拒绝,以及受支持的页面不存在和内存告警事件。
网络 request、downloadFile 的网络失败及 HTTP 状态码大于等于 500 的响应,受下述回调范围限制。

网络错误自动采集需要业务调用已提供 success、fail 或 complete 回调,并使用可安全复制的普通参数对象。冻结对象、空原型字典、不可枚举数据属性、Symbol 元数据以及响应式 Proxy 的有效值均可保留;原回调参数、返回值、异常和原生 task/Promise 保持不变。

以下情况不会自动生成请求完成日志:

  • 调用未提供任何回调。SDK 不注入回调,也不读取或订阅业务 Promise,以保留原有返回模式和未处理拒绝事件。
  • 参数含访问器或特殊原型。SDK 将原参数交给宿主,保留原有读取行为。
  • 请求属于 Logs 自身或已排除的 RUM 上传地址。

HTTP 4xx 不会仅因状态码生成错误日志。业务已捕获的失败可用 logger.error() 手动记录;未处理拒绝仍可由宿主运行时 hook 采集。成功请求和被排除的上传请求不会读取响应正文。

关联 RUM

Logs 可以独立使用。需要关联用户访问上下文时,按 MiniApp RUM 接入文档初始化 RUM SDK。RUM 上下文可用时,日志附带相应应用、会话、页面、操作和用户信息;不可用时仍可上报独立日志。

SDK 按日志发生时刻获取 RUM 上下文。延迟错误的历史资料缺失或过期时省略对应字段,不用当前页面替代。没有 RUM 关联时,普通即时日志仍可附带当前页面路由,但不会凭空生成 RUM 页面 ID。

Logs 自动排除自身上传地址,以及同一采集地址下的 /v1/write/rum。如果 RUM 与 Logs 使用不同域名、端口或代理路径,设置可选的 rumIntakeUrls,防止上传失败时相互采集:

datafluxLogs.init({
  datakitOrigin: 'https://logs.example.com',
  rumIntakeUrls: ['https://rum.example.com/v1/write/rum']
})

上述配置应并入最初的 init(),不要重复初始化。列表仅接受完整 HTTP(S) URL,初始化时保存快照,无效项会被忽略。比较时统一协议、主机名大小写和默认端口,忽略 query/fragment,保留完整路径及其大小写;不会排除同域名下其他业务路径。

上报字段

logger.log() 等记录日志的方法返回 void,不会返回日志对象。SDK 将数据写入 browser_log 来源;以下为日志查看器中常用字段,而非一个固定的嵌套 JSON 返回结构。

字段 内容
message、status、service 正文、等级和服务名称。
sdk_name、sdk_version SDK 名称和包版本。
app_id、env、version 应用 ID、运行环境和业务版本。
session_id Logs 会话标识;关联 RUM 时使用其会话信息。
view_id、view_name、view_referer、action_id 可用的页面、来源页面和操作信息;其中 view_name 对应页面路由。
userid、user_name、user_email RUM 上下文中可用的用户信息。
platform、platform_version、app_framework_version 小程序宿主类型、宿主版本和基础库版本。
device、model、device_uuid、os、os_version、network_type 设备品牌、型号、匿名安装标识、操作系统和网络信息。
error_source、error_type、error_stack 错误来源、类型和堆栈;按实际错误内容提供。
error_resource_url、error_resource_method、error_resource_status 网络错误对应的请求地址、方法和状态码。
自定义字段 例如 order_id、amount、paid;写入时保留有效值,避免与标准字段同名。

platform 表示小程序宿主,操作系统使用 os 等独立字段。device_uuid 是 SDK 生成并保存到本地存储的匿名安装标识,不是宿主 AppID 或硬件 ID;清除存储后重新生成,存储不可用时仅在当前运行期间稳定。

上报时机与限制

行为 说明
周期发送 默认每 30 秒尝试发送缓存日志。
批次发送 达到 50 条或约 16 KiB 的批次阈值时提前发送。
后台发送 宿主支持 onAppHide 时,应用进入后台触发发送。
单条大小 序列化后的单条日志必须小于 256 KiB,超过限制会被丢弃。
错误限频 同一 SDK 实例在一分钟窗口内最多上报 3000 条 status=error 的日志;超过后额外记录一次限频提示,窗口重置后恢复。
发送失败 日志尽力投递,不提供本地持久队列、失败自动重试或送达保证。

这些是 SDK 的内置发送行为,不是公开初始化选项。较大的对象或响应正文会增加单条日志体积,建议只记录排查需要的业务字段。

常见问题

现象 检查方式
初始化后没有日志 检查地址与令牌、请求域名及网络;确认 SDK 已在业务调用前初始化,sampleRate 不为 0,Logger 等级允许该条日志且 handler 为 http。等待周期发送,或在宿主支持时切后台触发发送。
控制台有输出,日志平台没有记录 检查是否使用了 handler: 'console';普通 console.log() 不会被自动上报。
Promise 请求失败没有网络日志 检查是否为无回调调用,或错误已被业务捕获;需要时显式调用 logger.error()。
错误没有关联到 RUM 页面 检查 RUM 是否已初始化、对应时刻的上下文是否存在;独立 Logs 日志不会自动创建 RUM 页面记录。
升级后配置项出现类型错误 对照初始化参数表移除未实现的选项,自定义字段通过上下文 API 添加。

SDK 更新日志

1.0.6(2026-09-09)

功能与兼容性

  • 完善微信、支付宝、百度、抖音和 uni 宿主的自动检测,以及设备、网络、存储和生命周期接口的兼容处理;可选接口不可用时安全降级。
  • 独立使用 Logs 时支持通过 applicationId 上报应用 ID;关联 RUM 时按日志发生时刻获取上下文,避免延迟错误关联到当前页面或会话。
  • 新增可选 rumIntakeUrls,用于排除独立采集地址的 RUM 上传;同一采集地址下的 Logs/RUM 上传自动排除,避免上传失败后相互采集。
  • 补齐公开 TypeScript 声明和发布包中的类型入口;移除 engines.node 安装限制,SDK 运行时不依赖 Node.js。仓库构建、测试和发布工具仍需满足各开发依赖的 Node.js 要求。

问题修复

  • 修复请求和下载拦截对原参数、业务回调、返回 task/Promise 及未处理拒绝事件的影响;保留响应式参数的有效值,采集异常不再影响业务调用。成功请求及排除的上传请求不再读取响应正文。
  • 修复上下文串改、危险属性合并和脱敏结果错误复用;在原对象上按实际字段名执行 toJSON(key) 并保存独立快照,支持私有字段脱敏器、对象、数组和 BigInt。
  • 修复根上下文及嵌套 tags 返回非字典或脱敏失败时产生数字字段、丢失已有字段的问题;无效上下文不会回退为未脱敏原值,单条日志不会修改持久上下文。
  • 修复运行时错误和未处理拒绝的多行正文、原始堆栈及网络诊断字段丢失;手动错误日志默认来源正确上报为 logger,自动错误保留实际来源。
  • 修复上报字段转义、Unicode 字节计数、0/false 等有效值丢失及批次重入问题;应用进入后台时及时刷新日志。platform 正确表示宿主,device_uuid 使用本地持久化的匿名安装标识。

升级说明

  • 移除未实现的初始化选项 tags、trackInteractions、allowedTracingOrigins、traceId128Bit 和 traceType;自定义字段使用上下文 API,交互与链路采集由 RUM SDK 配置。
  • 无回调调用,以及包含访问器或特殊原型的请求参数,会保持宿主原有行为,不自动生成请求完成日志;业务已捕获的失败可通过 logger.error() 手动记录,未处理拒绝仍可由宿主运行时 hook 采集。

文档评价

文档内容是否对您有帮助?