基于WebWorker和indexedDB的高性能、高容量、高扩展的web端日志系统
idb-logger
🚀 基于 WebWorker 和 indexedDB 的高性能、高容量、高扩展的web端日志系统
在线使用 | English | 更新日志 | 问题反馈 | Gitee
0. 介绍
idb-logger 致力于帮助web开发者便捷高效的接入高性能的日志系统,依托于webworker和indexedDB技术,web应用可以已几乎不影响用户体验的方式在浏览器中存入大容量的日志,并且在合适的时机上报到服务端,或者由用户自行下载。
0.1 特性
- 支持 WebWorker + indexedDB 存储日志
- 可选三种日志存储模式,且当不支持时会自动向下选择支持的模式
- 支持不存储模式,只使用idb-logger作为日志生成工具
- 支持定义最大存储日志数量,会自动删除最早的记录
- 支持下载日志
- 支持查询日志,支持多种查询模式
- 支持自定义基础数据
- 支持基于onReport回调自定义上报
1. 快速使用
1.0 install
1.0.1 npm install
1 | npm i idb-logger |
1 | import Logger from 'idb-logger'; |
1.0.2 cdn
1 | <script src="https://cdn.jsdelivr.net/npm/idb-logger/idb-logger.min.js"></script> |
1.1 快速使用
1 | const logger = new Logger(); |
1.2. api 介绍
ts声明:
1 | declare class Logger { |
完整的 logdata
1 | interface ILogDBData { |
1.2.1 构造函数
1 | new Logger({ |
- storeType
idb 表示使用indexedDB存储日志,storage 表示使用 localStorage进行存储日志,temp 表示使用js变量存储数据(非持久化),none表示不存储数据(仅将idb-logger作为日志生成工具)
默认值为idb,当某个存储类型浏览器不支持时,会自动向后选用下一个模式
- maxRecords
为了降低客户端性能消耗,可以指定一个最大存储数量,当超过这个数量时,logger会自动删除最早的记录并且 触发 onDiscard 回调
- baseInfo
接受一个json,用于注入日志的基础信息,当与默认baseInfo命名一致时会覆盖默认的baseInfo
默认的baseInfo clientid, uid, traceid, network, url, ua
1.2.2 打日志
logger对象上有四个方法:log,error, warn,info
使用方法类似支持传入任意数量、任意类型的数据
参数规则
- 当第一个参数是 字符串或者数字时,该参数作为log的msg字段,后面的所有参数合并成一个数组作为payload属性
- 当第一个参数json时且仅有一个参数,会将该json中的所有属性覆盖到log的属性上
- 当第一个参数不是数字或字符串,会将默认值__def__作为msg,所有参数合并成一个数组作为payload属性
1 | await logger.log('start'); // 返回Promise<{discard, add}> add 是添加的日志数据。该调用方式符合规则1 |
1.2.3 查询
1 | await logger.filter(filter); // 返回Promise |
filter 支持三种模式
- 过滤器
支持传入一个函数 (data: ILogDBData) => boolean
,回调函数是日志数据,返回 true 或者 false 表示是否该条数据命中
注意: 在indexedDB模式中,由于会将函数传到 worker中执行,要求函数中不能调用其他方法或者worker中不支持的特性
1 | await logger.filter(item=>{ |
- AND (传入json)
传入一个json,每个属性之间会使用 and 串起来, 支持正则表达式
1 | await logger.filter({ |
- OR (传入json数组)
传入一个json数组,数组中每个元素之间或使用 or 逻辑串起来,元素内属性之间使用 and 逻辑,与 2 中一致
1 | await logger.filter([{ |
上面语句表示日志中 msg含有xxx 或者 type等于log
1.2.4 下载
下载indexedDB中存储的日志
1 | await logger.download({ |
1.2.5 其他api
1.2.5.1 getAll
获取全部日志
1 | await logger.getAll(); |
1.2.5.1 get
根据日志id获取某条日志
1 | await logger.getAll(logid); |
1.2.5.1 count
获取日志数量
1 | await logger.count(); |
1.2.5.1 delete
根据日志id删除某条日志
1 | await logger.delete(logid); |
1.2.5.1 injectBaseInfo
注入日志基础信息
1 | await logger.injectBaseInfo({ |
1.2.5.1 refreshTraceId
刷新traceid,一般用于重连等,认为是第二次访问的场景
同时也会 refreshDurationStart
1 | await logger.refreshTraceId(); |
1.2.5.1 refreshDurationStart
刷新计时起点,一般用于需要重新统计时间的场景
1 | await logger.refreshTraceId(); |
1.2.5.1 close
关闭数据库
1 | await logger.close(); |
1.2.5.1 clear
关闭并且清空数据库
1 | await logger.clear(); |
1.2.5.1 destory
关闭、清空并且删除数据库
1 | await logger.destory(); |