easemob-uniapp-logger-plugin 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,110 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.4.2] - 2026-03-11
9
+
10
+ ### Changed
11
+
12
+ - **安全更新**:从 README 中移除 CMD 自动上传机制的说明
13
+ - 功能代码保留,仅文档中不再暴露
14
+ - 防止机制被滥用获取终端日志
15
+ - 文档仅展示自定义服务器上传方式
16
+
17
+ ## [1.4.1] - 2026-03-11
18
+
19
+ ### Changed
20
+
21
+ - **精简 README.md**:
22
+ - 淡化 CMD 自动上传的详细描述
23
+ - 精简为两种主要上传方式:
24
+ 1. 服务端触发自动上传(简要说明)
25
+ 2. 自定义服务器上传(详细示例)
26
+ - 删除冗长的多方案说明
27
+ - 保留核心 API 文档和示例
28
+
29
+ ## [1.4.0] - 2026-03-11
30
+
31
+ ### Added
32
+
33
+ - **上传失败记录错误日志**:上传或上报失败时自动记录错误到本地日志
34
+ - 包含错误消息、平台信息、时间戳等
35
+ - 方便后续排查上传问题
36
+ - 使用 `isInUploadProcess` 标志位防止重复上传
37
+
38
+ ### Changed
39
+
40
+ - 优化 `handleCmdMessage` 错误处理,避免重复记录错误
41
+ - 拆分 `upload` 方法为 `upload`(包装)和 `doUpload`(实际逻辑)
42
+
43
+ ## [1.3.0] - 2026-03-11
44
+
45
+ ### Added
46
+
47
+ - **日志原地滚动**:当文件超过 `maxFileSize` 时自动清空重写
48
+ - 永远只保留一个文件,上传逻辑简单
49
+ - 适合 IM 场景,只关心最近日志
50
+ - AppStorage 使用 `truncate(0)` 清空
51
+ - WechatMPStorage 使用 `writeFile` 覆盖
52
+
53
+ ## [1.2.0] - 2026-03-11
54
+
55
+ ### Added
56
+
57
+ - **上传超时配置**:新增 `uploadTimeout` 配置项,默认 30 秒
58
+ - **过期日志清理**:启动时自动清理超过 `expireDays` 的日志文件
59
+ - **微信小程序异步化**:全面使用异步文件 API,避免阻塞主线程
60
+ - **延迟格式化**:日志对象在 flush 时才格式化,减少频繁 CPU 操作
61
+
62
+ ### Changed
63
+
64
+ - **存储接口重构**:`IStorage.append()` 现在接受 `LogEntry[]` 而非格式化后的字符串
65
+ - **AppStorage 优化**:支持目录遍历和文件时间戳读取
66
+ - **WechatMPStorage 优化**:所有文件操作改为异步 Promise 风格
67
+
68
+ ## [1.1.0] - 2026-03-11
69
+
70
+ ### Added
71
+
72
+ - **日志时间戳**:为所有日志条目添加标准时间戳格式 `[YYYY-MM-DD HH:mm:ss.SSS]`
73
+ - **UMD 格式支持**:构建产物现在包含 UMD 格式 (`easemob-uniapp-logger.js`),支持 script 标签引入
74
+ - **CMD 自动上传**:支持通过服务端 CMD 消息 (`action: "em_upload_log"`) 触发自动上传
75
+ - **SDK 日志桥接**:新增 `handleSDKLog()` 方法,支持接入环信 SDK 内部日志
76
+ - **详细集成文档**:新增完整的集成指南和多种上传方案说明
77
+
78
+ ### Fixed
79
+
80
+ - **appKey 脱敏问题**:修复上报时使用脱敏 appKey 导致服务端无法查询日志的问题,现在使用原始 appKey
81
+ - **Flush 机制**:优化 CMD 触发上传时的 flush 逻辑,确保缓存日志完整写入后再压缩上传
82
+ - **文件不存在错误**:在压缩前添加 `ensureFileExists()` 检查,避免空文件错误
83
+
84
+ ### Changed
85
+
86
+ - **构建流程**:新增 `build:copy` 脚本,自动生成 `easemob-uniapp-logger.esm.js`
87
+ - **类型导出**:从 `logger.ts` 直接导出 `SDKLogData` 和 `SDKMessage` 类型
88
+ - **API 兼容性**:支持 `apiUrl`、`api_url`、`restUrl` 多种字段名获取 API 地址
89
+
90
+ ## [1.0.0] - 2025-XX-XX
91
+
92
+ ### Added
93
+
94
+ - 初始版本发布
95
+ - 基础日志功能(DEBUG、INFO、WARN、ERROR、FATAL)
96
+ - 多平台存储支持(App - plus.io、微信小程序、内存存储)
97
+ - 日志压缩功能(App 平台)
98
+ - 自定义上传配置(URL、Handler)
99
+ - 环信服务器上传集成
100
+ - TypeScript 类型支持
101
+
102
+ ---
103
+
104
+ [1.4.2]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/compare/v1.4.1...v1.4.2
105
+ [1.4.1]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/compare/v1.4.0...v1.4.1
106
+ [1.4.0]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/compare/v1.3.0...v1.4.0
107
+ [1.3.0]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/compare/v1.2.0...v1.3.0
108
+ [1.2.0]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/compare/v1.1.0...v1.2.0
109
+ [1.1.0]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/compare/v1.0.0...v1.1.0
110
+ [1.0.0]: https://github.com/Easemob-Community/easemob-uniapp-logger-plugin/releases/tag/v1.0.0
package/README.md ADDED
@@ -0,0 +1,283 @@
1
+ # easemob-uniapp-logger-plugin
2
+
3
+ 一个适用于 uni-app 应用的高性能日志收集工具类库,支持日志本地存储和上传到自定义服务器。
4
+
5
+ ## 特性
6
+
7
+ - 📱 **多平台支持**:兼容 iOS、Android (App平台) 和 微信小程序
8
+ - 📝 **日志级别**:支持 DEBUG、INFO、WARN、ERROR、FATAL 级别
9
+ - 💾 **文件存储**:App平台使用 plus.io 文件系统,小程序使用本地文件系统
10
+ - 🗜️ **日志压缩**:支持将日志文件压缩为 zip (App平台)
11
+ - ☁️ **上传灵活**:支持自定义服务器上传
12
+ - ⚙️ **延迟写入**:批量写入机制,减少 IO 操作
13
+
14
+ ## 安装
15
+
16
+ ```bash
17
+ npm install easemob-uniapp-logger-plugin
18
+ ```
19
+
20
+ 或直接将 `dist/easemob-uniapp-logger.esm.js` 复制到你的项目的 `js_sdk` 目录下。
21
+
22
+ ## 快速开始
23
+
24
+ ### 基础用法
25
+
26
+ ```javascript
27
+ //实际SDK
28
+ import websdk from '../js_sdk/Easemob-chat'
29
+ import {
30
+ logger
31
+ } from '../js_sdk/easemob-uniapp-logger.esm.js'
32
+
33
+ // 创建 SDK 实例
34
+ const EMClient = new websdk.connection({
35
+ appKey: 'YOUR_APPKEY#YOUR_ORG',
36
+ url:'wss://im-api-wechat.easemob.com/websocket',
37
+ apiUrl:'https://a1.easemob.com'
38
+ })
39
+ console.log('>>>>>SDK version', EMClient.version)
40
+ logger.init({
41
+ conn: EMClient
42
+ });
43
+
44
+ websdk.logger.onLog = (data) => {
45
+ console.log('>>>>>SDK输出的日志', data)
46
+ logger.handleSDKLog(data);
47
+ }
48
+ ```
49
+
50
+ ---
51
+
52
+ ## 上传到自定义服务器
53
+
54
+ ```javascript
55
+ import { logger } from 'easemob-uniapp-logger-plugin';
56
+
57
+ logger.init({
58
+ customUpload: {
59
+ handler: async (logContent) => {
60
+ const deviceInfo = uni.getSystemInfoSync();
61
+
62
+ // 上传到你的服务器
63
+ const res = await uni.request({
64
+ url: 'https://your-server.com/api/logs/upload',
65
+ method: 'POST',
66
+ header: {
67
+ 'Content-Type': 'application/json',
68
+ 'Authorization': 'Bearer your-api-token'
69
+ },
70
+ data: {
71
+ logs: logContent,
72
+ deviceInfo: {
73
+ brand: deviceInfo.brand,
74
+ model: deviceInfo.model,
75
+ system: deviceInfo.system,
76
+ platform: deviceInfo.platform,
77
+ },
78
+ timestamp: Date.now(),
79
+ }
80
+ });
81
+
82
+ if (res.statusCode !== 200) {
83
+ throw new Error('上传失败: ' + res.statusCode);
84
+ }
85
+ }
86
+ }
87
+ });
88
+
89
+ // 在合适的时机调用上传
90
+ await logger.upload();
91
+ ```
92
+
93
+ ---
94
+
95
+ ## 完整示例
96
+
97
+ ### 在 App.vue 中使用
98
+
99
+ ```vue
100
+ <script>
101
+ import { logger } from 'easemob-uniapp-logger-plugin';
102
+ import { conn } from '@/utils/websdk'; // 你的 SDK 实例
103
+
104
+ export default {
105
+ globalData: { logger },
106
+
107
+ onLaunch() {
108
+ // 初始化 logger(传入 conn 以使用环信上传功能)
109
+ logger.init({ conn });
110
+
111
+ // 桥接 SDK 日志
112
+ websdk.logger.onLog = (data) => {
113
+ logger.handleSDKLog(data);
114
+ };
115
+
116
+ logger.info('App launched');
117
+ },
118
+
119
+ onError(err) {
120
+ logger.error('App error', err);
121
+ }
122
+ }
123
+ </script>
124
+ ```
125
+
126
+ ### 反馈页面上传日志
127
+
128
+ ```vue
129
+ <template>
130
+ <view class="feedback-page">
131
+ <textarea v-model="content" placeholder="请输入反馈内容" />
132
+ <button @click="submitFeedback">提交反馈并上传日志</button>
133
+ </view>
134
+ </template>
135
+
136
+ <script>
137
+ import { logger } from 'easemob-uniapp-logger-plugin';
138
+
139
+ export default {
140
+ data() {
141
+ return { content: '' };
142
+ },
143
+ methods: {
144
+ async submitFeedback() {
145
+ try {
146
+ uni.showLoading({ title: '上传中...' });
147
+ logger.info('用户反馈', { content: this.content });
148
+ await logger.upload();
149
+ uni.showToast({ title: '提交成功', icon: 'success' });
150
+ } catch (err) {
151
+ uni.showToast({ title: '上传失败', icon: 'none' });
152
+ }
153
+ }
154
+ }
155
+ }
156
+ </script>
157
+ ```
158
+
159
+ ---
160
+
161
+ ## API 文档
162
+
163
+ ### 初始化
164
+
165
+ ```typescript
166
+ logger.init(options?: LoggerOptions): void
167
+ ```
168
+
169
+ **LoggerOptions:**
170
+
171
+ | 属性 | 类型 | 描述 |
172
+ |------|------|------|
173
+ | `log` | `Partial<LoggerConfig>` | 日志配置 |
174
+ | `customUpload` | `CustomUploadConfig` | 自定义上传配置 |
175
+
176
+ **LoggerConfig:**
177
+
178
+ | 属性 | 类型 | 默认值 | 描述 |
179
+ |------|------|--------|------|
180
+ | `expireDays` | `number` | `7` | 日志文件过期天数 |
181
+ | `maxFileSize` | `number` | `2097152` (2MB) | 单个文件最大大小 |
182
+ | `uploadTimeout` | `number` | `30000` | 上传超时时间(ms) |
183
+
184
+ ### 记录日志
185
+
186
+ ```typescript
187
+ logger.debug(message: string, data?: unknown): void
188
+ logger.info(message: string, data?: unknown): void
189
+ logger.warn(message: string, data?: unknown): void
190
+ logger.error(message: string, data?: unknown): void
191
+ logger.fatal(message: string, data?: unknown): void
192
+ ```
193
+
194
+ ### 处理 SDK 日志
195
+
196
+ ```typescript
197
+ logger.handleSDKLog(data: SDKLogData): void
198
+
199
+ // 使用示例
200
+ websdk.logger.onLog = (data) => {
201
+ logger.handleSDKLog(data);
202
+ };
203
+ ```
204
+
205
+ ### 上传日志
206
+
207
+ ```typescript
208
+ // 基础上传(使用初始化配置)
209
+ await logger.upload(options?: CustomUploadConfig);
210
+
211
+ // 上传到指定 URL
212
+ await logger.uploadTo(url: string, headers?: Record<string, string>);
213
+
214
+ // 使用自定义 handler
215
+ await logger.uploadWithHandler(handler: CustomUploadHandler);
216
+ ```
217
+
218
+ ### 其他方法
219
+
220
+ ```typescript
221
+ // 读取日志内容
222
+ const logs = await logger.read();
223
+
224
+ // 获取日志文件路径
225
+ const path = logger.getFilePath();
226
+
227
+ // 清空日志
228
+ await logger.clear();
229
+
230
+ // 压缩日志(App平台)
231
+ const zipPath = await logger.compress();
232
+
233
+ // 设置日志级别
234
+ logger.setMinLevel('WARN');
235
+
236
+ // 销毁 logger
237
+ logger.destroy();
238
+ ```
239
+
240
+ ---
241
+
242
+ ## 构建产物
243
+
244
+ ```
245
+ dist/
246
+ ├── index.js # ES Module(默认入口)
247
+ ├── easemob-uniapp-logger.esm.js # ES Module(推荐用于 uni-app)
248
+ ├── easemob-uniapp-logger.js # UMD(用于 script 标签)
249
+ └── index.d.ts # TypeScript 类型声明
250
+ ```
251
+
252
+ ### 使用 ES Module(推荐)
253
+
254
+ ```javascript
255
+ import { logger } from './js_sdk/easemob-uniapp-logger.esm.js';
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 平台支持
261
+
262
+ | 功能 | App (iOS/Android) | 微信小程序 | H5/其他 |
263
+ |------|-------------------|------------|---------|
264
+ | 文件存储 | ✅ plus.io | ✅ wx FileSystem | ❌ 内存存储 |
265
+ | 日志压缩 | ✅ plus.zip | ❌ | ❌ |
266
+ | 上传(Handler) | ✅ | ✅ | ✅ |
267
+
268
+ ---
269
+
270
+ ## 日志格式
271
+
272
+ ```
273
+ [2026-03-11 14:07:28.123] [DEBUG] 调试信息 {"detail":"xxx"}
274
+ [2026-03-11 14:07:28.456] [INFO] 用户登录成功 {"user":"alice"}
275
+ [2026-03-11 14:07:29.789] [ERROR] 请求失败 {"code":500}
276
+ [2026-03-11 14:07:30.012] [DEBUG] [SDK] Call fetchUserInfoById ["user1"]
277
+ ```
278
+
279
+ ---
280
+
281
+ ## License
282
+
283
+ MIT