IndexedDB 可在断网时持久化存储日志并网络恢复后批量同步——需设计带 synced 状态的日志表、事务安全写入、分批同步、错误重试及定期清理机制。

IndexedDB 可以在断网时持久化存储日志,等网络恢复后再批量同步到服务端——关键在于合理设计数据库结构、事务控制、错误重试和状态标记。
设计带同步状态的日志表
创建一个 logs 对象仓库,字段至少包含:id(自增或 UUID)、timestamp、level(如 "error" / "info")、message、data(可选 JSON 字符串)、synced(布尔值,默认 false)。用 synced 标记是否已成功上传,避免重复发送。
示例建库代码片段:
const request = indexedDB.open("logDB", 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains("logs")) {
const store = db.createObjectStore("logs", { keyPath: "id", autoIncrement: true });
store.createIndex("bySynced", "synced", { unique: false });
}
};
离线写入:用事务保证可靠性
每次记录日志都开启只读/读写事务,写入前检查 IndexedDB 是否可用(避免 Safari 私密模式等限制),失败时降级为内存暂存(但不持久)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 批量写入时用
add()或put()批量提交,避免频繁事务开销 - 捕获
abort和error事件,记录失败原因(如空间不足、版本冲突) - 对超大日志(如 >1MB)考虑分块或压缩后再存,防止单条记录过大触发 QuotaExceededError
网络恢复后自动同步
监听 online 事件触发同步逻辑,但不要立即全量发送——应按时间顺序或优先级(如 error 日志优先)分批上传,每批 50–200 条,避免请求超时或服务端拒绝。
- 使用
fetch()发送 POST 请求,body 为 JSON 数组;服务端需支持批量接收 - 成功响应后,用
delete()或更新synced: true标记这批日志已同步 - 失败时记录错误并延迟重试(如指数退避:1s → 3s → 9s),同时避免阻塞后续批次
容错与清理机制
长期离线可能导致日志堆积,需主动管理:
- 设置最大保留天数(如 7 天),定期清理
synced: true且timestamp过旧的日志 - 同步失败超过 N 次(如 5 次)的日志,可标记为
failed: true并停止重试,防止死循环 - 提供手动触发同步的 API(如
window.logSync.flush()),便于调试或用户主动提交

















