@zhin.js/logger 0.1.0
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/LICENSE +21 -0
- package/README.md +501 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +14 -0
- package/lib/index.js.map +1 -0
- package/lib/logger.d.ts +273 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +590 -0
- package/lib/logger.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 凉菜
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
# @zhin.js/logger
|
|
2
|
+
|
|
3
|
+
轻量级、高性能的日志库,为 Zhin Bot Framework 提供完整的日志记录功能。
|
|
4
|
+
|
|
5
|
+
## ✨ 特性
|
|
6
|
+
|
|
7
|
+
- 🎯 **轻量级**: 仅依赖 chalk,无额外第三方库
|
|
8
|
+
- 🎨 **自定义格式**: 【date】【level】【name】:【message】
|
|
9
|
+
- 🌈 **智能着色**: 自动为不同级别和名称分配颜色
|
|
10
|
+
- 🎨 **颜色自定义**: 完全自定义级别、名称、日期颜色(新功能)
|
|
11
|
+
- 📊 **多输出支持**: 控制台、文件、流等多种输出方式
|
|
12
|
+
- ⚡ **性能监控**: 内置高精度计时功能
|
|
13
|
+
- 🎯 **命名空间**: 支持分层次的 Logger 命名空间
|
|
14
|
+
- 🛡️ **类型安全**: 完整的 TypeScript 类型支持
|
|
15
|
+
- 🔄 **智能继承**: 子Logger自动继承父Logger配置
|
|
16
|
+
|
|
17
|
+
## 📦 安装
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm add @zhin.js/logger
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 🚀 快速开始
|
|
24
|
+
|
|
25
|
+
### 基础用法
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { createLogger, info, success, warn, error } from '@zhin.js/logger'
|
|
29
|
+
|
|
30
|
+
// 使用便捷函数(默认 logger)
|
|
31
|
+
info('应用启动')
|
|
32
|
+
success('操作成功')
|
|
33
|
+
warn('警告信息')
|
|
34
|
+
error('错误信息')
|
|
35
|
+
|
|
36
|
+
// 创建命名空间 Logger
|
|
37
|
+
const logger = createLogger('MyApp')
|
|
38
|
+
logger.info('这是来自 MyApp 的日志')
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 输出格式
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
[09-08 04:07:55.852] [INFO] [MyApp]: 应用启动
|
|
45
|
+
[09-08 04:07:55.854] [WARN] [Database]: 连接超时
|
|
46
|
+
[09-08 04:07:55.855] [ERROR] [Auth]: 用户验证失败
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- **日期格式**: `MM-dd HH:MM:ss.SSS`
|
|
50
|
+
- **级别着色**: DEBUG(灰), INFO(蓝), WARN(黄), ERROR(红)
|
|
51
|
+
- **名称着色**: 自动为不同名称分配颜色,便于区分
|
|
52
|
+
|
|
53
|
+
## 📖 详细用法
|
|
54
|
+
|
|
55
|
+
### 1. 日志级别
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { createLogger, LogLevel } from '@zhin.js/logger'
|
|
59
|
+
|
|
60
|
+
const logger = createLogger('Test')
|
|
61
|
+
|
|
62
|
+
logger.debug('调试信息') // 灰色
|
|
63
|
+
logger.info('一般信息') // 蓝色
|
|
64
|
+
logger.warn('警告信息') // 黄色
|
|
65
|
+
logger.error('错误信息') // 红色
|
|
66
|
+
logger.success('成功信息') // INFO级别,带绿色✓标记
|
|
67
|
+
|
|
68
|
+
// 设置日志级别
|
|
69
|
+
logger.setLevel(LogLevel.WARN) // 只显示 WARN 和 ERROR
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2. 命名空间和子 Logger
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const appLogger = createLogger('App')
|
|
76
|
+
const dbLogger = appLogger.getLogger('Database') // 自动继承父级配置
|
|
77
|
+
const apiLogger = appLogger.getLogger('API')
|
|
78
|
+
|
|
79
|
+
appLogger.info('主应用日志') // [App]: ...
|
|
80
|
+
dbLogger.info('数据库日志') // [App:Database]: ...
|
|
81
|
+
apiLogger.info('API日志') // [App:API]: ...
|
|
82
|
+
|
|
83
|
+
// 多层嵌套
|
|
84
|
+
const httpLogger = apiLogger.getLogger('HTTP')
|
|
85
|
+
const routerLogger = httpLogger.getLogger('Router')
|
|
86
|
+
httpLogger.info('HTTP服务启动') // [App:API:HTTP]: ...
|
|
87
|
+
routerLogger.info('路由就绪') // [App:API:HTTP:Router]: ...
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 3. 参数格式化
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
const logger = createLogger('Format')
|
|
94
|
+
|
|
95
|
+
// 支持 printf 风格的格式化,与 console.info 行为一致
|
|
96
|
+
logger.info('用户 %s 登录成功,ID: %d', 'John', 123)
|
|
97
|
+
logger.warn('连接超时,重试 %d/%d', 3, 5)
|
|
98
|
+
logger.error('操作失败:%o', { code: 500, message: 'Server Error' })
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 4. 性能监控
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
const logger = createLogger('Performance')
|
|
105
|
+
|
|
106
|
+
// 方式1:使用返回的 Timer
|
|
107
|
+
const timer = logger.time('数据处理')
|
|
108
|
+
// ... 执行操作
|
|
109
|
+
timer.end() // 输出: 数据处理 took 123.45ms
|
|
110
|
+
|
|
111
|
+
// 方式2:使用 timeEnd
|
|
112
|
+
logger.time('API调用')
|
|
113
|
+
// ... 执行操作
|
|
114
|
+
logger.timeEnd('API调用') // 输出: API调用 took 67.89ms
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 5. 配置继承与覆盖
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const appLogger = createLogger('App')
|
|
121
|
+
|
|
122
|
+
// 子 Logger 自动继承父级配置
|
|
123
|
+
const dbLogger = appLogger.getLogger('Database')
|
|
124
|
+
// dbLogger 继承了 appLogger 的级别、格式化器、输出器
|
|
125
|
+
|
|
126
|
+
// 递归设置级别(影响所有子 Logger)
|
|
127
|
+
appLogger.setLevel(LogLevel.WARN, true)
|
|
128
|
+
|
|
129
|
+
// 创建时覆盖特定配置
|
|
130
|
+
const debugLogger = appLogger.getLogger('Debug', {
|
|
131
|
+
level: LogLevel.DEBUG // 覆盖父级的 WARN 级别
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
// 父子关系管理
|
|
135
|
+
console.log(dbLogger.getParent()?.getName()) // 'App'
|
|
136
|
+
console.log(appLogger.isRoot()) // true
|
|
137
|
+
console.log(appLogger.getChildLoggerNames()) // ['Database', 'Debug']
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 6. 文件输出
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import fs from 'node:fs'
|
|
144
|
+
import { createLogger, FileTransport, ConsoleTransport } from '@zhin.js/logger'
|
|
145
|
+
|
|
146
|
+
const logFile = fs.createWriteStream('./app.log', { flags: 'a' })
|
|
147
|
+
|
|
148
|
+
const logger = createLogger('FileApp', {
|
|
149
|
+
transports: [
|
|
150
|
+
new ConsoleTransport(), // 控制台输出(带颜色)
|
|
151
|
+
new FileTransport(logFile) // 文件输出(无颜色)
|
|
152
|
+
]
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
logger.info('这条日志会同时输出到控制台和文件')
|
|
156
|
+
|
|
157
|
+
// 递归添加输出器到所有子 Logger
|
|
158
|
+
logger.addTransport(new FileTransport(logFile), true)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 7. 自定义格式化器
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
import { createLogger, LogFormatter } from '@zhin.js/logger'
|
|
165
|
+
|
|
166
|
+
class CustomFormatter implements LogFormatter {
|
|
167
|
+
format(entry) {
|
|
168
|
+
const { level, name, message, timestamp } = entry
|
|
169
|
+
return `${timestamp.toISOString()} [${name}] ${message}`
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const logger = createLogger('Custom', {
|
|
174
|
+
formatter: new CustomFormatter()
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
// 递归设置格式化器到所有子 Logger
|
|
178
|
+
logger.setFormatter(new CustomFormatter(), true)
|
|
179
|
+
|
|
180
|
+
logger.info('自定义格式的日志')
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 8. 流输出
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
import { createLogger, StreamTransport } from '@zhin.js/logger'
|
|
187
|
+
|
|
188
|
+
const logger = createLogger('StreamApp', {
|
|
189
|
+
transports: [
|
|
190
|
+
new StreamTransport(process.stdout, false), // 保留颜色
|
|
191
|
+
new StreamTransport(process.stderr, true) // 移除颜色
|
|
192
|
+
]
|
|
193
|
+
})
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 9. 自定义颜色配置 🎨
|
|
197
|
+
|
|
198
|
+
完全自定义Logger的颜色方案,让不同模块、环境、团队成员拥有独特的视觉效果。
|
|
199
|
+
|
|
200
|
+
#### 基础颜色自定义
|
|
201
|
+
```typescript
|
|
202
|
+
import { getLogger, LogLevel } from '@zhin.js/logger'
|
|
203
|
+
import chalk from 'chalk'
|
|
204
|
+
|
|
205
|
+
const logger = getLogger('MyApp', {
|
|
206
|
+
colors: {
|
|
207
|
+
// 自定义级别颜色
|
|
208
|
+
levelColors: {
|
|
209
|
+
[LogLevel.INFO]: chalk.magenta.bold,
|
|
210
|
+
[LogLevel.WARN]: chalk.cyan,
|
|
211
|
+
[LogLevel.ERROR]: chalk.green.bold.underline
|
|
212
|
+
},
|
|
213
|
+
// 自定义名称颜色(单色或多色循环)
|
|
214
|
+
nameColor: chalk.blue.bold,
|
|
215
|
+
// 自定义日期颜色
|
|
216
|
+
dateColor: chalk.yellow
|
|
217
|
+
}
|
|
218
|
+
})
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
#### 团队协作颜色分配
|
|
222
|
+
```typescript
|
|
223
|
+
// 为不同开发者分配专属颜色
|
|
224
|
+
const aliceLogger = getLogger('Alice', {
|
|
225
|
+
colors: { nameColor: chalk.magenta.bold }
|
|
226
|
+
})
|
|
227
|
+
const bobLogger = getLogger('Bob', {
|
|
228
|
+
colors: { nameColor: chalk.cyan.bold }
|
|
229
|
+
})
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
#### 模块功能分类
|
|
233
|
+
```typescript
|
|
234
|
+
// 数据库模块 - 蓝色主题
|
|
235
|
+
const dbLogger = getLogger('Database', {
|
|
236
|
+
colors: {
|
|
237
|
+
levelColors: { [LogLevel.INFO]: chalk.blue.bold },
|
|
238
|
+
nameColor: chalk.blue
|
|
239
|
+
}
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
// 安全模块 - 红色警告主题
|
|
243
|
+
const securityLogger = getLogger('Security', {
|
|
244
|
+
colors: {
|
|
245
|
+
levelColors: {
|
|
246
|
+
[LogLevel.ERROR]: chalk.red.bold.bgYellow
|
|
247
|
+
},
|
|
248
|
+
nameColor: chalk.red.bold
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
#### 多色循环配置
|
|
254
|
+
```typescript
|
|
255
|
+
const multiColorLogger = getLogger('Development', {
|
|
256
|
+
colors: {
|
|
257
|
+
nameColor: [
|
|
258
|
+
chalk.red.bold,
|
|
259
|
+
chalk.green.bold,
|
|
260
|
+
chalk.blue.bold,
|
|
261
|
+
chalk.magenta.bold
|
|
262
|
+
]
|
|
263
|
+
}
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
// 每个子Logger将循环使用不同颜色
|
|
267
|
+
const router = multiColorLogger.getLogger('Router') // 红色
|
|
268
|
+
const service = multiColorLogger.getLogger('Service') // 绿色
|
|
269
|
+
const utils = multiColorLogger.getLogger('Utils') // 蓝色
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### 继承与覆盖
|
|
273
|
+
```typescript
|
|
274
|
+
// 父Logger配置
|
|
275
|
+
const parent = getLogger('Parent', {
|
|
276
|
+
colors: {
|
|
277
|
+
dateColor: chalk.blue,
|
|
278
|
+
nameColor: chalk.magenta.bold
|
|
279
|
+
}
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
// 子Logger继承配置
|
|
283
|
+
const child1 = parent.getLogger('Child1') // 完全继承
|
|
284
|
+
|
|
285
|
+
// 子Logger部分覆盖
|
|
286
|
+
const child2 = parent.getLogger('Child2', {
|
|
287
|
+
colors: {
|
|
288
|
+
levelColors: { [LogLevel.INFO]: chalk.red.bold }
|
|
289
|
+
// dateColor和nameColor继承自父Logger
|
|
290
|
+
}
|
|
291
|
+
})
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
> 📖 **详细文档**: 查看 [CUSTOM_COLORS.md](./CUSTOM_COLORS.md) 了解更多颜色配置示例和最佳实践
|
|
295
|
+
|
|
296
|
+
## ⚙️ 全局配置
|
|
297
|
+
|
|
298
|
+
### 设置全局日志级别
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
import { setGlobalLogLevel, LogLevel } from '@zhin.js/logger'
|
|
302
|
+
|
|
303
|
+
// 所有新创建的 logger 都会使用此级别
|
|
304
|
+
setGlobalLogLevel(LogLevel.WARN)
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### 设置全局格式化器
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
import { setGlobalFormatter, DefaultFormatter } from '@zhin.js/logger'
|
|
311
|
+
|
|
312
|
+
const customFormatter = new DefaultFormatter()
|
|
313
|
+
setGlobalFormatter(customFormatter)
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### 添加全局输出器
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
import { addGlobalTransport, FileTransport } from '@zhin.js/logger'
|
|
320
|
+
import fs from 'node:fs'
|
|
321
|
+
|
|
322
|
+
const globalLogFile = fs.createWriteStream('./global.log', { flags: 'a' })
|
|
323
|
+
addGlobalTransport(new FileTransport(globalLogFile))
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## 📚 API 参考
|
|
327
|
+
|
|
328
|
+
### LogLevel 枚举
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
enum LogLevel {
|
|
332
|
+
DEBUG = 0,
|
|
333
|
+
INFO = 1,
|
|
334
|
+
WARN = 2,
|
|
335
|
+
ERROR = 3,
|
|
336
|
+
SILENT = 4
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Logger 类
|
|
341
|
+
|
|
342
|
+
```typescript
|
|
343
|
+
class Logger {
|
|
344
|
+
// 构造函数
|
|
345
|
+
constructor(name: string, options?: LoggerOptions, parent?: Logger)
|
|
346
|
+
|
|
347
|
+
// 日志方法
|
|
348
|
+
debug(message: string, ...args: any[]): void
|
|
349
|
+
info(message: string, ...args: any[]): void
|
|
350
|
+
success(message: string, ...args: any[]): void
|
|
351
|
+
warn(message: string, ...args: any[]): void
|
|
352
|
+
error(message: string, ...args: any[]): void
|
|
353
|
+
|
|
354
|
+
// 子 Logger 管理(新架构核心功能)
|
|
355
|
+
getLogger(namespace: string, options?: LoggerOptions): Logger
|
|
356
|
+
removeChildLogger(namespace: string): boolean
|
|
357
|
+
getChildLoggerNames(): string[]
|
|
358
|
+
getParent(): Logger | undefined
|
|
359
|
+
isRoot(): boolean
|
|
360
|
+
|
|
361
|
+
// 配置管理(支持递归操作)
|
|
362
|
+
setLevel(level: LogLevel, recursive?: boolean): void
|
|
363
|
+
setFormatter(formatter: LogFormatter, recursive?: boolean): void
|
|
364
|
+
addTransport(transport: LogTransport, recursive?: boolean): void
|
|
365
|
+
removeTransport(transport: LogTransport, recursive?: boolean): void
|
|
366
|
+
|
|
367
|
+
// 工具方法
|
|
368
|
+
getLevel(): LogLevel
|
|
369
|
+
isLevelEnabled(level: LogLevel): boolean
|
|
370
|
+
time(label: string): Timer
|
|
371
|
+
timeEnd(label: string): void
|
|
372
|
+
logIf(condition: boolean, level: LogLevel, message: string, ...args: any[]): void
|
|
373
|
+
getName(): string
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### 便捷函数
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// Logger 管理(新架构)
|
|
381
|
+
function createLogger(name: string, options?: LoggerOptions): Logger
|
|
382
|
+
function getDefaultLogger(): Logger
|
|
383
|
+
function getRootLogger(name: string, options?: LoggerOptions): Logger
|
|
384
|
+
|
|
385
|
+
// 全局设置(递归应用)
|
|
386
|
+
function setGlobalLogLevel(level: LogLevel): void
|
|
387
|
+
|
|
388
|
+
// 根 Logger 管理
|
|
389
|
+
function removeRootLogger(name: string): boolean
|
|
390
|
+
function getRootLoggerNames(): string[]
|
|
391
|
+
function clearLoggers(): void
|
|
392
|
+
|
|
393
|
+
// 便捷日志方法(使用默认 logger)
|
|
394
|
+
function debug(message: string, ...args: any[]): void
|
|
395
|
+
function info(message: string, ...args: any[]): void
|
|
396
|
+
function success(message: string, ...args: any[]): void
|
|
397
|
+
function warn(message: string, ...args: any[]): void
|
|
398
|
+
function error(message: string, ...args: any[]): void
|
|
399
|
+
function time(label: string): Timer
|
|
400
|
+
function timeEnd(label: string): void
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## 🔧 在 Zhin 插件中使用
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
import { Plugin } from 'zhin.js'
|
|
407
|
+
import { createLogger } from '@zhin.js/logger'
|
|
408
|
+
|
|
409
|
+
export default class MyPlugin extends Plugin {
|
|
410
|
+
private logger = createLogger(`Plugin:${this.name}`)
|
|
411
|
+
|
|
412
|
+
async onMounted() {
|
|
413
|
+
this.logger.success('插件加载成功')
|
|
414
|
+
|
|
415
|
+
this.logger.info('插件配置: %o', this.config)
|
|
416
|
+
|
|
417
|
+
// 创建子模块 Logger
|
|
418
|
+
const dbLogger = this.logger.getLogger('Database')
|
|
419
|
+
const apiLogger = this.logger.getLogger('API')
|
|
420
|
+
|
|
421
|
+
dbLogger.info('数据库模块初始化')
|
|
422
|
+
apiLogger.info('API模块初始化')
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
async handleMessage(message: Message) {
|
|
426
|
+
// 为每个消息创建独立的处理 Logger
|
|
427
|
+
const msgLogger = this.logger.getLogger('MessageHandler')
|
|
428
|
+
const timer = msgLogger.time('消息处理')
|
|
429
|
+
|
|
430
|
+
try {
|
|
431
|
+
msgLogger.debug('收到消息: %s', message.content)
|
|
432
|
+
|
|
433
|
+
// 使用不同子 Logger 处理不同逻辑
|
|
434
|
+
const validatorLogger = msgLogger.getLogger('Validator')
|
|
435
|
+
const processorLogger = msgLogger.getLogger('Processor')
|
|
436
|
+
|
|
437
|
+
validatorLogger.debug('开始验证消息')
|
|
438
|
+
processorLogger.debug('开始处理消息')
|
|
439
|
+
|
|
440
|
+
await this.processMessage(message)
|
|
441
|
+
|
|
442
|
+
msgLogger.success('消息处理完成')
|
|
443
|
+
|
|
444
|
+
} catch (error) {
|
|
445
|
+
msgLogger.error('消息处理失败: %s', error.message)
|
|
446
|
+
throw error
|
|
447
|
+
|
|
448
|
+
} finally {
|
|
449
|
+
timer.end()
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
## 🎯 设计特点
|
|
456
|
+
|
|
457
|
+
### 轻量级依赖
|
|
458
|
+
- 仅依赖 `chalk` 用于颜色输出
|
|
459
|
+
- 无其他第三方库,包体积小
|
|
460
|
+
- 启动速度快,内存占用低
|
|
461
|
+
|
|
462
|
+
### 自管理架构(核心特色)
|
|
463
|
+
- **层次化管理**: 每个 Logger 自管理其子 Logger
|
|
464
|
+
- **getLogger 方法**: 直观的子 Logger 获取方式
|
|
465
|
+
- **配置继承**: 子 Logger 自动继承父级配置
|
|
466
|
+
- **配置覆盖**: 支持在创建时覆盖特定配置
|
|
467
|
+
- **递归操作**: 支持递归设置级别、格式化器、输出器
|
|
468
|
+
- **父子关系**: 完整的父子关系查询和管理
|
|
469
|
+
|
|
470
|
+
### 智能着色系统
|
|
471
|
+
- **级别颜色**: 固定的颜色方案,一目了然
|
|
472
|
+
- **名称颜色**: 自动分配,相同名称始终相同颜色
|
|
473
|
+
- **文件输出**: 自动去除颜色代码
|
|
474
|
+
|
|
475
|
+
### 高性能设计
|
|
476
|
+
- 使用原生 `performance.now()` 进行高精度计时
|
|
477
|
+
- 级别检查避免不必要的字符串处理
|
|
478
|
+
- 最小化内存分配和垃圾回收
|
|
479
|
+
- 缓存子 Logger 实例,避免重复创建
|
|
480
|
+
|
|
481
|
+
## 🆚 对比优势
|
|
482
|
+
|
|
483
|
+
| 特性 | @zhin.js/logger | pino | winston |
|
|
484
|
+
|------|----------------|------|---------|
|
|
485
|
+
| 包大小 | < 50KB | > 500KB | > 1MB |
|
|
486
|
+
| 依赖数量 | 1 | 10+ | 20+ |
|
|
487
|
+
| 启动时间 | 极快 | 快 | 中等 |
|
|
488
|
+
| 自定义格式 | ✅ 简单 | ⚠️ 复杂 | ⚠️ 复杂 |
|
|
489
|
+
| 颜色输出 | ✅ 内置 | ❌ 需插件 | ❌ 需插件 |
|
|
490
|
+
| 子Logger管理 | ✅ **自管理** | ⚠️ 全局管理 | ⚠️ 全局管理 |
|
|
491
|
+
| 配置继承 | ✅ **自动继承** | ❌ 手动配置 | ❌ 手动配置 |
|
|
492
|
+
| 递归操作 | ✅ **内置支持** | ❌ 不支持 | ❌ 不支持 |
|
|
493
|
+
| TypeScript | ✅ 原生 | ✅ 支持 | ✅ 支持 |
|
|
494
|
+
|
|
495
|
+
## 📄 许可证
|
|
496
|
+
|
|
497
|
+
MIT
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
一个专为 Zhin Bot Framework 设计的轻量级、高性能日志库。🚀
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { LogLevel, LOG_LEVEL_NAMES, LOG_LEVEL_COLORS, Logger, DefaultFormatter, ConsoleTransport, FileTransport, StreamTransport, getLogger, setLogger, setOptions, addTransport, removeTransport, setFormatter, setLevel, getLevel, isLevelEnabled, setName, getName, getLoggerNames } from './logger.js';
|
|
2
|
+
export type { LogEntry, LogFormatter, LogTransport, LoggerOptions, TransportSecurityOptions, LoggerColorOptions, ColorFunction, Timer } from './logger.js';
|
|
3
|
+
import defaultLogger from './logger.js';
|
|
4
|
+
export declare const debug: (message: string, ...args: any[]) => void;
|
|
5
|
+
export declare const info: (message: string, ...args: any[]) => void;
|
|
6
|
+
export declare const success: (message: string, ...args: any[]) => void;
|
|
7
|
+
export declare const warn: (message: string, ...args: any[]) => void;
|
|
8
|
+
export declare const error: (message: string, ...args: any[]) => void;
|
|
9
|
+
export declare const time: (label: string) => import("./logger.js").Timer;
|
|
10
|
+
export declare const timeEnd: (label: string) => void;
|
|
11
|
+
export default defaultLogger;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,OAAO,EACP,OAAO,EACP,cAAc,EACf,MAAM,aAAa,CAAA;AAEpB,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,KAAK,EACN,MAAM,aAAa,CAAA;AAGpB,OAAO,aAAa,MAAM,aAAa,CAAA;AAGvC,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,SAA0C,CAAA;AAC/F,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,SAAyC,CAAA;AAC7F,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,SAA4C,CAAA;AACnG,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,SAAyC,CAAA;AAC7F,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,SAA0C,CAAA;AAC/F,eAAO,MAAM,IAAI,GAAI,OAAO,MAAM,gCAA8B,CAAA;AAChE,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,SAAiC,CAAA;AAEtE,eAAe,aAAa,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// 导入所有内容从 logger.ts
|
|
2
|
+
export { LogLevel, LOG_LEVEL_NAMES, LOG_LEVEL_COLORS, Logger, DefaultFormatter, ConsoleTransport, FileTransport, StreamTransport, getLogger, setLogger, setOptions, addTransport, removeTransport, setFormatter, setLevel, getLevel, isLevelEnabled, setName, getName, getLoggerNames } from './logger.js';
|
|
3
|
+
// 导入默认logger和便捷方法
|
|
4
|
+
import defaultLogger from './logger.js';
|
|
5
|
+
// 便捷方法(使用默认logger)
|
|
6
|
+
export const debug = (message, ...args) => defaultLogger.debug(message, ...args);
|
|
7
|
+
export const info = (message, ...args) => defaultLogger.info(message, ...args);
|
|
8
|
+
export const success = (message, ...args) => defaultLogger.success(message, ...args);
|
|
9
|
+
export const warn = (message, ...args) => defaultLogger.warn(message, ...args);
|
|
10
|
+
export const error = (message, ...args) => defaultLogger.error(message, ...args);
|
|
11
|
+
export const time = (label) => defaultLogger.time(label);
|
|
12
|
+
export const timeEnd = (label) => defaultLogger.timeEnd(label);
|
|
13
|
+
export default defaultLogger;
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EACL,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,OAAO,EACP,OAAO,EACP,cAAc,EACf,MAAM,aAAa,CAAA;AAapB,kBAAkB;AAClB,OAAO,aAAa,MAAM,aAAa,CAAA;AAEvC,mBAAmB;AACnB,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AAC/F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AAC7F,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AACnG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AAC7F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;AAC/F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAChE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtE,eAAe,aAAa,CAAA"}
|