UNPKG

@lx-frontend/multi-track

Version:

sls 日志上传功能,当前支持小程序、web

120 lines (119 loc) 3.61 kB
import type { ITrackConfig, ITrackOptions, SlsOptions } from './type'; /** * 日志上报抽象类 * 业务端需要重新实现 format 方法,将日志格式化成 Sls 需要的格式 */ export declare abstract class Track<ILog extends Record<string, any>, LogData extends ILog & { id: string; } = any> { private logQueue; private prepareLogQueue; private processingIds; private isUploading; slsOptions: SlsOptions; config: Required<ITrackOptions>; private debounceTimer; private flushIntervalTimer; private nextId; protected constructor(trackConfig: ITrackConfig); /** * 不同系统对上报日志有差异,暴露 format 方法,让子类实现兼容各业务系统 */ abstract format(log: LogData): LogData; /** * 由子类实现具体的日志上报逻辑 * 如果失败,则抛出异常 * Note: 小程序中不支持 Headers 类型,需要使用 Record<string, string> 类型 */ abstract _upload(payload: string | any | Uint8Array<ArrayBufferLike>, headers: Record<string, string>): Promise<unknown>; /** * 获取存储对象 */ abstract _getStorage(key: string): any[]; /** * 设置存储对象 */ abstract _setStorage(key: string, value: any[]): void; /** * 生成唯一ID,通过时间戳+自增ID。很高效的唯一ID方式。 */ private generateId; /** * 当前不同平台处理 request 不同,暴露给子类处理 * 生成 sls 请求 url * eq: https://biz-frontend-upload.cn-shanghai.log.aliyuncs.com/logstores/ucma-frontend/track?APIVersion=0.6.0 * project + host + '/logstores' + logstore + '/track?APIVersion=0.6.0' */ generateSlsUrl(): string; /** * 注意 sls 的 value 只能是字符串。单单 JSON.stringify 遇到 number 这些会报错 PostBodyInvalid * 将对象转换为字符串 */ transString(obj: Record<string, any>): Record<string, any>; /** * 获取 sls 上报所需格式,注意 sls 的 value 只能是字符串 * 数据需要二次 JSON.stringify * @link https://help.aliyun.com/zh/sls/developer-reference/api-sls-2020-12-30-putwebtracking?spm=a2c4g.11186623.0.0.39c93b79Z9iOcy * @param logData 日志数组 */ getRequestInfo(logData: LogData[]): { payload: string; headers: { 'x-log-apiversion': string; 'x-log-bodyrawsize': string; }; }; /** * 设置是否开启日志上报 */ setUploadEnabled(enabled: boolean): void; /** * 添加日志到队列 */ add(log: any): void; /** * 使用防抖上报日志 */ private debounceUpload; /** * 由于日志都是异步参数,可能会出现乱序,所以需要排序 * 按照 eventId 升序排序 * @param arr * @private */ private sortByEventId; /** * 获取可上传的日志(未在处理中的日志) */ private getUploadLogs; /** * 从队列中移除指定ID的日志 */ private removeLogsById; /** * 上报日志 */ upload(): Promise<boolean>; /** * 强制上报日志 */ flush(): Promise<boolean>; /** * 定时上报日志 */ private initializeFlushInterval; /** * 持久化日志到 localStorage */ private persistLogs; /** * 获取本地存储的日志 * @returns */ private getPersistedLogs; /** * 恢复持久化的日志 */ private restorePersistedLogs; destroy(): void; }