浏览 SDKs · uni-app / uni-app x
SDKsuni-app

日志与诊断

配置 UTS 插件日志级别,使用 operationID 关联调用链路,并在用户同意后上传脱敏日志。

复制

unix-openim-sdk 的日志用于定位 Android、iOS、HarmonyOS 上的初始化、登录和业务 API 调用问题。开发与预发布环境可以输出更详细的 SDK 日志;生产环境应只保留必要的错误与追踪字段,避免记录 Token、消息正文、文件 URL、服务端凭据或其他用户隐私。

日志链路通常包含 OpenIMInitConfig 中的日志配置、单次调用可选的 operationID、插件抛出的诊断信息、上传进度事件,以及应用自己的结构化日志。

日志级别

日志级别在 initSDK() 时通过 OpenIMInitConfig.logLevel 配置。从最详细到最简略依次为:

常量数值说明
OpenIMLogLevelVerbose6最详细的运行跟踪,只用于短期深度诊断。
OpenIMLogLevelDebug5开发与联调信息。
OpenIMLogLevelInfo4常规运行信息。
OpenIMLogLevelWarn3警告信息。
OpenIMLogLevelError2错误信息。
OpenIMLogLevelFatal1严重错误。
OpenIMLogLevelPanic0最严重级别。

生产环境不建议长期使用 VerboseDebug。更稳妥的方式是按环境、灰度开关或用户主动提交诊断信息时临时提高日志级别。

日志级别建议

场景建议配置说明
本地开发OpenIMLogLevelDebugisLogStandardOutput: true在 Logcat 或 Xcode 控制台查看 SDK 调用细节。
联调或预发布根据问题临时使用更详细级别配合用户 ID、会话 ID、错误码和 OpenIMServer 日志定位。
生产默认OpenIMLogLevelWarnOpenIMLogLevelError,关闭不必要的标准输出降低噪声和敏感信息泄露风险。
用户诊断模式临时提高级别,并说明收集范围取得用户同意,遵守隐私、保留与删除策略。

配置日志

日志选项属于 SDK 初始化配置,不是 login() 参数。下面以 Android 为例:

import {
  OpenIMLogLevelDebug,
  OpenIMPlatformAndroid,
  initSDK,
  type OpenIMInitConfig,
} from '@/uni_modules/unix-openim-sdk'

const config : OpenIMInitConfig = {
  platformID: OpenIMPlatformAndroid,
  apiAddr: 'https://im-api.example.com',
  wsAddr: 'wss://im-ws.example.com',
  logLevel: OpenIMLogLevelDebug,
  isLogStandardOutput: true,
  systemType: 'android',
}

await initSDK(config)

参数说明

参数类型是否必填说明
logLevelOpenIMLogLevel控制 Core 运行日志的详细程度。
isLogStandardOutputboolean是否把 SDK 日志写到平台标准输出;开发与短期诊断时使用。
logFilePathstringnull自定义日志路径;通常让插件使用平台默认目录,只有明确管理沙盒路径时才覆盖。

apiAddrwsAddr、平台和 systemType 仍是初始化必需配置,但不是日志字段。插件错误中的错误码与错误信息也不是初始化日志参数。

使用 operationID 定位一次调用

operationID 是单次 SDK 调用的可选链路标识。多数异步 API 把它作为最后一个参数;日常调用可以省略,由插件生成或交给 Core 处理。只有需要把一次具体调用与原生日志、OpenIMServer 日志精确对应时,才显式创建并传入。

import { getConversationListSplit } from '@/uni_modules/unix-openim-sdk'

const operationID = createDiagnosticOperationID()

try {
  const result = await getConversationListSplit(
    { offset: 0, count: 50 },
    operationID,
  )

  appLogger.info('openim_api_success', {
    operationID,
    action: 'get_conversation_page',
    count: result?.conversations.length ?? 0,
  })
} catch (error) {
  appLogger.error('openim_api_failed', {
    operationID,
    action: 'get_conversation_page',
    error: sanitizeOpenIMError(error),
  })
  throw error
}

每次调用使用新的 operationID,不要让多个无关请求共享同一个值。它不是用户身份、权限凭据、会话 ID 或业务幂等键,不能替代 Token、conversationIDclientMsgID。一个业务流程包含多次 SDK 调用时,为每次调用生成独立 operationID,另用业务侧 trace ID 串联整个流程。

记录业务上下文

应用日志可以保留页面路由、业务动作、operationID、脱敏错误码和必要的目标标识,例如 conversationIDclientMsgID。不要记录:

  • 用户 Token、管理员 Token、secret 或商业业务凭据。
  • 完整消息正文、原始自定义消息 payload、私人文件 URL。
  • 不必要的用户资料、通讯录、群成员清单。
  • SDK 数据库内容和完整本机沙盒路径。

日志中的目标标识也应按支持与隐私策略处理。公开 issue 或跨团队传递前再次脱敏。

上传日志

uploadLogs() 接收上传行数和扩展说明。上传前必须取得用户同意,并说明收集范围、用途和保留策略。

import { uploadLogs } from '@/uni_modules/unix-openim-sdk'

const operationID = createDiagnosticOperationID()

await uploadLogs(
  {
    line: 2000,
    ex: JSON.stringify({ scene: 'login-timeout' }),
  },
  operationID,
)

参数说明

参数类型是否必填说明
linenumber本次上传的日志行数。应设置上限,避免无界上传。
exstring脱敏后的诊断扩展信息,例如场景名称;不要放 Token、消息或凭据。

Promise 成功表示日志上传请求已经完成,不代表问题已经提交给支持团队或已经得到处理。失败时限制重试次数,避免后台持续消耗流量与电量。

观察上传进度

onUploadLogsProgress() 返回独立订阅句柄。进度事件的完整业务归属在消息概览;日志页面只说明诊断上传时的使用边界。拥有该监听的诊断 service 结束时,必须通过 off(subscription) 释放。

上传进度用于界面展示,不代表服务端已经完成问题分析。不要把原始日志内容或 Token 塞入进度状态。

相关页面