浏览 SDKs · Flutter
SDKsFlutter

日志

配置 OpenIM Flutter SDK 日志,并使用 operationID 定位调用链路。

复制

开发和预发布环境可以输出较详细的 SDK 日志;生产环境应降低级别并关闭不必要的标准输出。不要记录 Token、完整消息正文、原始文件 URL 或用户隐私字段。

初始化日志配置

Flutter SDK 在 initSDK() 时配置日志,而不是在 login() 时配置。

import 'dart:io';

final platformID = Platform.isIOS
    ? IMPlatform.ios
    : IMPlatform.android;

await OpenIM.iMManager.initSDK(
  platformID: platformID,
  apiAddr: apiAddr,
  wsAddr: wsAddr,
  dataDir: dataDir,
  listener: connectListener,
  logLevel: 5,
  isLogStandardOutput: true,
  logFilePath: logFilePath,
);

示例面向 Flutter 的 Android 与 iOS 运行环境:Android 使用 IMPlatform.android,iOS 使用 IMPlatform.ios。不要把 Android 平台值硬编码到 iOS 构建中。

参数说明
logLevelSDK 日志级别数字;固定 SDK 默认值为 6,应按部署环境选择。
isLogStandardOutput是否输出到平台标准日志;开发诊断时开启。
logFilePath可选日志文件路径;应放在应用可写目录。

生产环境建议关闭标准输出并只保留必要级别。日志目录受平台权限与生命周期约束,不要硬编码其他应用或系统目录。

写入与上传日志

await OpenIM.iMManager.logs(
  logLevel: 5,
  file: 'chat_repository.dart',
  line: 120,
  msgs: 'load conversation page failed',
  err: error.toString(),
  keyAndValues: ['conversationID', conversationID],
);

需要由用户主动提交诊断日志时,可以监听上传进度并调用 uploadLogs()

OpenIM.iMManager.setUploadLogsListener(
  OnUploadLogsListener(
    onUploadProgress: (current, size) {
      updateLogUploadProgress(current, size);
    },
  ),
);

await OpenIM.iMManager.uploadLogs(ex: 'user initiated diagnostics');

setUploadLogsListener() 保存的是 manager 级 singleton listener,后一次设置会覆盖前一次。固定 SDK 没有 remove 或 unset API,因此应在应用统一的 SDK 绑定层设置一次,并由该层把进度分发给当前界面;不要在每个页面或组件重复设置。退出登录或切换账号时,清空应用层订阅和上一账号的上传状态,避免进度或错误显示到新账号界面。

上传前应向用户说明收集范围,并按隐私与合规要求处理日志。

使用 operationID 定位调用

operationID 是单次 SDK 调用的链路标识。Flutter SDK 多数方法把它作为可选命名参数;省略时 Utils.checkOperationID() 会生成 UUID。仅在需要与 OpenIMServer 日志精确对应时显式传入,每次调用使用新的值。

final operationID = createUniqueTraceID();
try {
  await OpenIM.iMManager.conversationManager.getConversationListSplit(
    offset: 0,
    count: 50,
    operationID: operationID,
  );
} catch (error) {
  appLogger.error('openim_api_failed', {
    'operationID': operationID,
    'action': 'get_conversation_page',
    'error': error.toString(),
  });
  rethrow;
}

示例中的 createUniqueTraceID() 代表应用已有的唯一追踪 ID 生成器;无需为了日志额外引入依赖,也可以直接省略 operationID。它不是身份凭据、业务幂等键或 conversationID,不能替代 Token 和业务标识。