{"id":17288339,"url":"https://github.com/theajack/logger","last_synced_at":"2025-04-14T11:21:21.134Z","repository":{"id":50671168,"uuid":"517258862","full_name":"theajack/logger","owner":"theajack","description":"Web logger based on indexedDB and WebWorker","archived":false,"fork":false,"pushed_at":"2025-03-06T15:10:37.000Z","size":406,"stargazers_count":30,"open_issues_count":0,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-12T04:35:07.231Z","etag":null,"topics":["indexeddb","web-logger","webworker"],"latest_commit_sha":null,"homepage":"https://shiyix.cn/jsbox?github=theajack.logger","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theajack.png","metadata":{"files":{"readme":"README.cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-24T07:42:24.000Z","updated_at":"2025-03-06T15:10:41.000Z","dependencies_parsed_at":"2024-11-08T04:02:36.188Z","dependency_job_id":null,"html_url":"https://github.com/theajack/logger","commit_stats":{"total_commits":22,"total_committers":3,"mean_commits":7.333333333333333,"dds":"0.18181818181818177","last_synced_commit":"5edbc135d884d89c399694f5a8cfa8b799751750"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theajack%2Flogger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theajack%2Flogger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theajack%2Flogger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theajack%2Flogger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theajack","download_url":"https://codeload.github.com/theajack/logger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248726656,"owners_count":21151924,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["indexeddb","web-logger","webworker"],"created_at":"2024-10-15T10:27:16.501Z","updated_at":"2025-04-14T11:21:21.065Z","avatar_url":"https://github.com/theajack.png","language":"TypeScript","readme":"\u003c!--\n * @Author: tackchen\n * @Date: 2022-08-03 21:24:33\n * @Description: Coding something\n--\u003e\n\n# [idb-logger](https://github.com/theajack/logger)\n\n\u003cp\u003e\n    \u003ca href=\"https://www.github.com/theajack/logger/stargazers\" target=\"_black\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/stars/theajack/logger?logo=github\" alt=\"stars\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.github.com/theajack/logger/network/members\" target=\"_black\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/forks/theajack/logger?logo=github\" alt=\"forks\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.npmjs.com/package/idb-logger\" target=\"_black\"\u003e\n        \u003cimg src=\"https://img.shields.io/npm/v/idb-logger?logo=npm\" alt=\"version\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.npmjs.com/package/idb-logger\" target=\"_black\"\u003e\n        \u003cimg src=\"https://img.shields.io/npm/dm/idb-logger?color=%23ffca28\u0026logo=npm\" alt=\"downloads\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.jsdelivr.com/package/npm/idb-logger\" target=\"_black\"\u003e\n        \u003cimg src=\"https://data.jsdelivr.com/v1/package/npm/idb-logger/badge\" alt=\"jsdelivr\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/theajack/logger/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-closed/theajack/logger.svg\" alt=\"issue\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003e\n    \u003ca href=\"https://github.com/theajack\" target=\"_black\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Author-%20theajack%20-7289da.svg?\u0026logo=github\" alt=\"author\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.github.com/theajack/logger/blob/master/LICENSE\" target=\"_black\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/license/theajack/logger?color=%232DCE89\u0026logo=github\" alt=\"license\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://cdn.jsdelivr.net/npm/idb-logger/idb-logger.min.js\"\u003e\u003cimg src=\"https://img.shields.io/bundlephobia/minzip/idb-logger.svg\" alt=\"Size\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/theajack/logger/search?l=javascript\"\u003e\u003cimg src=\"https://img.shields.io/github/languages/top/theajack/logger.svg\" alt=\"TopLang\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.github.com/theajack/logger\"\u003e\u003cimg src=\"https://img.shields.io/librariesio/dependent-repos/npm/idb-logger.svg\" alt=\"Dependent\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/theajack/logger/blob/master/test/test-report.txt\"\u003e\u003cimg src=\"https://img.shields.io/badge/test-passed-44BB44\" alt=\"test\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch3\u003e🚀 基于 WebWorker 和 indexedDB 的高性能、高容量、高扩展的web端日志系统\u003c/h3\u003e\n\n**[在线使用](https://shiyix.cn/jsbox?github=theajack.logger) | [English](https://github.com/theajack/logger) | [更新日志](https://github.com/theajack/logger/blob/master/scripts/version.md) | [问题反馈](https://github.com/theajack/logger/issues/new) | [Gitee](https://gitee.com/theajack/logger)**\n\n## 0. 介绍\n\nidb-logger 致力于帮助web开发者便捷高效的接入高性能的日志系统，依托于webworker和indexedDB技术，web应用可以已几乎不影响用户体验的方式在浏览器中存入大容量的日志，并且在合适的时机上报到服务端，或者由用户自行下载。\n\n### 0.1 特性\n\n1. 支持 WebWorker + indexedDB 存储日志\n2. 可选三种日志存储模式，且当不支持时会自动向下选择支持的模式\n3. 支持不存储模式，只使用idb-logger作为日志生成工具\n4. 支持定义最大存储日志数量，会自动删除最早的记录\n5. 支持下载日志\n6. 支持查询日志，支持多种查询模式\n7. 支持自定义基础数据\n8. 支持基于onReport回调自定义上报\n\n## 1. 快速使用\n\n### 1.0 install\n\n#### 1.0.1 npm install\n\n```\nnpm i idb-logger\n```\n\n```js\nimport Logger from 'idb-logger';\n```\n\n#### 1.0.2 cdn\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/idb-logger/idb-logger.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  window.IDBLogger;\n\u003c/script\u003e\n```\n\n### 1.1 快速使用\n\n\n```js\nconst logger = new Logger();\n\nlogger.log('一条普通日志');\nlogger.error('一条错误日志', '附加信息', {type: '附加信息'});\n\nlogger.log('start').then(({discard, add})=\u003e{\n    // add 为日志详情\n    // 如果达到了 maxRecords，discard 则为丢弃的日志，否则为null\n})\n\nlogger.download(); // 下载日志\n```\n\n### 1.2. api 介绍\n\nts声明：\n\n```ts\ndeclare class Logger {\n    static version: string;\n    private _store;\n    id: string;\n    storeType: TLogStoreType;\n    constructor({ id, useConsole, storeType, maxRecords, baseInfo, onReport, onDiscard, }?: ILoggerOption);\n    injectBaseInfo(baseInfo?: IBaseInfoOption \u0026 IJson): Promise\u003cvoid\u003e;\n    log(...args: any[]): Promise\u003cIAddReturn\u003e;\n    error(...args: any[]): Promise\u003cIAddReturn\u003e;\n    warn(...args: any[]): Promise\u003cIAddReturn\u003e;\n    info(...args: any[]): Promise\u003cIAddReturn\u003e;\n    private _logCommon;\n    close(): Promise\u003cboolean\u003e;\n    destory(): Promise\u003cboolean\u003e;\n    clear(): Promise\u003cboolean\u003e;\n    count(): Promise\u003cnumber\u003e;\n    delete(logid: string): Promise\u003cboolean\u003e;\n    refreshTraceId(): Promise\u003cvoid\u003e;\n    refreshDurationStart(): Promise\u003cvoid\u003e;\n    download({ name, filter }?: {\n        name?: string;\n        filter?: TFilterOption;\n        keys?: string[];\n    }): Promise\u003cnumber\u003e;\n    get(logid: string): Promise\u003cILogDBData | null\u003e;\n    getAll(): Promise\u003cILogDBData[]\u003e;\n    filter(filter?: TFilterOption): Promise\u003cILogDBData[]\u003e;\n}\n```\n\n完整的 logdata\n\n```ts\ninterface ILogDBData {\n    uid: string; // 用户id 会存储在storage中\n    clientid: string; // 客户端id 会存储在storage中\n    traceid: string; // 本次访问id，可以通过 refreshTraceId 刷新\n    network: string; // 网络状况\n    url: string; // 当前url\n    ua: string; // 浏览器ua\n\n    msg: string; // 消息类型，如果log第一个参数是字符串，则取该值\n    payload?: any; // log的其他参数\n    type: TLogType; // log info warn error\n    duration: number; // 页面进入到当前日志的时间，可以通过 refreshDurationStart 刷新计时七点\n    time: string; // 时间字符串\n    timestamp: number; // 时间戳\n    logid: string; // 日志唯一id\n}\n```\n\n#### 1.2.1 构造函数\n\n```ts\nnew Logger({\n  id, // 指定数据库名称 默认值：default\n  useConsole, // 是否打印到控制台 默认 true\n  storeType, // 存储模式，默认 idb，支持 idb storage temp none\n  maxRecords, // 最大存储记录数 默认10000\n  baseInfo, // 注入自定义的基础信息\n  onReport, // 当生成日志时触发，可用于自定义上报数据\n  onDiscard, // 当达到 maxRecords 时触发，丢弃掉的数据\n  onError, // error listener\n});\n```\n\n声明\n\n```ts\ninterface ILoggerOption extends Partial\u003cIStoreConfig\u003e {\n    id?: string;\n    useConsole?: boolean;\n    storeType?: TLogStoreType;\n    maxRecords?: number;\n    baseInfo?: IBaseInfo;\n    onReport?: (data: ILogDBData) =\u003e void;\n    onDiscard?: (data: ILogDBData) =\u003e void;\n    onError?: (err: ILogError) =\u003e void;\n}\n```\n\n1. storeType\n\nidb 表示使用indexedDB存储日志，storage 表示使用 localStorage进行存储日志，temp 表示使用js变量存储数据（非持久化），none表示不存储数据（仅将idb-logger作为日志生成工具）\n\n默认值为idb，当某个存储类型浏览器不支持时，会自动向后选用下一个模式\n\n2. maxRecords\n\n为了降低客户端性能消耗，可以指定一个最大存储数量，当超过这个数量时，logger会自动删除最早的记录并且 触发 onDiscard 回调\n\n3. baseInfo \n\n接受一个json，用于注入日志的基础信息，当与默认baseInfo命名一致时会覆盖默认的baseInfo\n\n默认的baseInfo `clientid, uid, traceid, network, url, ua`\n\n#### 1.2.2 打日志\n\nlogger对象上有四个方法：log，error， warn，info\n\n使用方法类似支持传入任意数量、任意类型的数据\n\n参数规则\n\n1. 当第一个参数是 字符串或者数字时，该参数作为log的msg字段，后面的所有参数合并成一个数组作为payload属性\n2. 当第一个参数json时且仅有一个参数，会将该json中的所有属性覆盖到log的属性上\n3. 当第一个参数不是数字或字符串，会将默认值__def__作为msg，所有参数合并成一个数组作为payload属性\n   \n\n```ts\nawait logger.log('start'); // 返回Promise\u003c{discard, add}\u003e add 是添加的日志数据。该调用方式符合规则1\nawait logger.info({\n    msg: 'start', // 写入message\n    time: 'xxxx', // 覆盖log的属性\n    your_custom: 'xxxx', // 自定义属性\n}); // 该调用方式符合规则2\nawait logger.warn({}, [], '', 1); // 该调用方式符合规则3\nawait logger.error('error', {}, [], '', 1); // 该调用方式符合规则1\n```\n\n#### 1.2.3 查询\n\n```ts\nawait logger.filter(filter); // 返回Promise\n```\n\nfilter 支持三种模式\n\n1. 过滤器\n\n支持传入一个函数 `(data: ILogDBData) =\u003e boolean`，回调函数是日志数据，返回 true 或者 false 表示是否该条数据命中\n\n注意: 在indexedDB模式中，由于会将函数传到 worker中执行，要求函数中不能调用其他方法或者worker中不支持的特性\n\n```ts\nawait logger.filter(item=\u003e{\n    return item.msg.includes('xxx') \u0026\u0026 item.type === 'log';\n})\n```\n\n2. AND （传入json）\n\n传入一个json，每个属性之间会使用 and 串起来, 支持正则表达式\n\n```ts\nawait logger.filter({\n    msg: /xxx/i,\n    type: 'log',\n})\n```\n\n3. OR （传入json数组）\n\n传入一个json数组，数组中每个元素之间或使用 or 逻辑串起来，元素内属性之间使用 and 逻辑，与 2 中一致\n\n```ts\nawait logger.filter([{\n    msg: /xxx/i,\n}, {\n    type: 'log',\n}])\n```\n\n上面语句表示日志中 msg含有xxx 或者 type等于log\n\n#### 1.2.4 下载\n\n下载indexedDB中存储的日志\n\n```ts\nawait logger.download({\n    name, // 可选 下载文件的名字 默认为时间戳\n    filter, // 可选 同 1.2.3 中的 filter\n    keys, // 可选 指定需要下载的额外属性\n});\n```\n\n#### 1.2.5 其他api\n\n##### 1.2.5.1 getAll\n\n获取全部日志\n\n```ts\nawait logger.getAll();\n```\n\n##### 1.2.5.1 get\n\n根据日志id获取某条日志\n\n```ts\nawait logger.getAll(logid);\n```\n\n##### 1.2.5.1 count\n\n获取日志数量\n\n```ts\nawait logger.count();\n```\n\n##### 1.2.5.1 delete\n\n根据日志id删除某条日志\n\n```ts\nawait logger.delete(logid);\n```\n\n##### 1.2.5.1 injectBaseInfo\n\n注入日志基础信息\n\n```ts\nawait logger.injectBaseInfo({\n    network: 'wifi',\n    phone: 'xxxx',\n});\n```\n\n##### 1.2.5.1 refreshTraceId\n\n刷新traceid，一般用于重连等，认为是第二次访问的场景\n\n同时也会 refreshDurationStart\n\n```ts\nawait logger.refreshTraceId();\n```\n\n##### 1.2.5.1 refreshDurationStart\n\n刷新计时起点，一般用于需要重新统计时间的场景\n\n```ts\nawait logger.refreshTraceId();\n```\n\n##### 1.2.5.1 close\n\n关闭数据库\n\n```ts\nawait logger.close();\n```\n\n##### 1.2.5.1 clear\n\n关闭并且清空数据库\n\n```ts\nawait logger.clear();\n```\n\n##### 1.2.5.1 destory\n\n关闭、清空并且删除数据库\n\n```ts\nawait logger.destory();\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheajack%2Flogger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheajack%2Flogger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheajack%2Flogger/lists"}