mm_logger 0.0.0-stage → 1.0.1
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/.gitattributes +5 -0
- package/LICENSE +15 -0
- package/README.md +325 -2
- package/eslint.config.js +68 -0
- package/example/index.js +40 -0
- package/examples/basic.js +70 -0
- package/examples/http.js +71 -0
- package/examples/query.js +84 -0
- package/index.js +27 -0
- package/jest.config.js +18 -0
- package/lib/colors.js +200 -0
- package/lib/console_logger.js +71 -0
- package/lib/level.js +15 -0
- package/lib/logger.js +1098 -0
- package/package.json +57 -5
- package/test/colors.test.js +265 -0
- package/test/console_logger.test.js +92 -0
- package/test.js +57 -0
package/.gitattributes
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024, 邱文武
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,326 @@
|
|
|
1
|
-
#
|
|
1
|
+
# mm_logger
|
|
2
|
+
|
|
3
|
+
高性能 Node.js 日志模块,支持多级别日志、文件轮转、事件钩子和灵活配置。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 📝 **多级别日志**: debug, info, success, warn, error, fatal
|
|
8
|
+
- 💾 **文件轮转**: 按大小自动分割日志文件
|
|
9
|
+
- 🎨 **双格式输出**: 支持 JSON 和文本格式
|
|
10
|
+
- 🖥️ **双路输出**: 同时输出到控制台和文件
|
|
11
|
+
- 🌐 **HTTP 日志**: 单独记录 HTTP 请求日志
|
|
12
|
+
- 🔍 **日志查询**: 支持按日期、时间、关键词查询
|
|
13
|
+
- 🎯 **事件钩子**: 支持日志记录前后的事件监听
|
|
14
|
+
- ⚡ **异步处理**: 非阻塞日志写入,提高应用性能
|
|
15
|
+
- 🧹 **自动清理**: 自动管理日志文件数量
|
|
16
|
+
- 🌈 **ANSI 着色工具**: 内置 `colors`,按终端能力自动启用 / 禁用颜色
|
|
17
|
+
- 🧩 **轻量日志器**: `ConsoleLogger` 提供零依赖的彩色控制台输出
|
|
18
|
+
|
|
19
|
+
## 安装
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install mm_logger
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 快速开始
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
const { Logger } = require('mm_logger');
|
|
29
|
+
|
|
30
|
+
// 创建日志实例
|
|
31
|
+
const logger = new Logger({
|
|
32
|
+
level: 'debug',
|
|
33
|
+
dir: './logs',
|
|
34
|
+
console: true,
|
|
35
|
+
file: true
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// 记录日志
|
|
39
|
+
logger.debug('调试信息');
|
|
40
|
+
logger.info('普通信息');
|
|
41
|
+
logger.success('成功信息');
|
|
42
|
+
logger.warn('警告信息');
|
|
43
|
+
logger.error('错误信息');
|
|
44
|
+
logger.fatal('致命错误');
|
|
45
|
+
|
|
46
|
+
// 记录带参数的日志
|
|
47
|
+
logger.info('用户登录', { username: 'admin', ip: '127.0.0.1' });
|
|
48
|
+
|
|
49
|
+
// 记录 HTTP 日志
|
|
50
|
+
logger.http('info', 'API 请求', { method: 'GET', url: '/api/users' });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 示例代码
|
|
54
|
+
|
|
55
|
+
仓库提供可直接运行的示例,位于 `examples/` 目录:
|
|
56
|
+
|
|
57
|
+
- `examples/basic.js`:基础用法,演示各级别日志、带参数日志和动态更新配置
|
|
58
|
+
- `examples/http.js`:HTTP 请求日志的记录与查询
|
|
59
|
+
- `examples/query.js`:日志查询、读取、清空与删除
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
node examples/basic.js
|
|
63
|
+
node examples/http.js
|
|
64
|
+
node examples/query.js
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 配置选项
|
|
68
|
+
|
|
69
|
+
| 配置项 | 类型 | 默认值 | 描述 |
|
|
70
|
+
|-------|------|-------|------|
|
|
71
|
+
| `level` | string | `'debug'` | 日志级别 |
|
|
72
|
+
| `dir` | string | `'./log'` | 日志文件目录 |
|
|
73
|
+
| `console` | boolean | `true` | 是否输出到控制台 |
|
|
74
|
+
| `file` | boolean | `true` | 是否输出到文件 |
|
|
75
|
+
| `max_size` | number | `3145728` (3MB) | 单个日志文件最大大小(字节) |
|
|
76
|
+
| `max_files` | number | `7` | 保留的日志文件最大数量 |
|
|
77
|
+
| `date_pattern` | string | `'_yyyy-MM-dd'` | 日期格式 |
|
|
78
|
+
| `content_pattern` | string | `'%d{hh:mm:ss.SSS} [%p] - %m'` | 日志内容格式 |
|
|
79
|
+
| `file_name_pattern` | string | `'{type}_{date}_{index}'` | 文件名格式 |
|
|
80
|
+
| `is_json` | boolean | `false` | 是否使用 JSON 格式输出 |
|
|
81
|
+
|
|
82
|
+
## 日志级别
|
|
83
|
+
|
|
84
|
+
日志级别从低到高排序:
|
|
85
|
+
|
|
86
|
+
- `debug`: 调试信息,开发环境使用
|
|
87
|
+
- `info`: 普通信息,记录程序运行状态
|
|
88
|
+
- `success`: 成功信息,记录操作成功
|
|
89
|
+
- `warn`: 警告信息,需要关注但不影响运行
|
|
90
|
+
- `error`: 错误信息,功能异常但程序仍可运行
|
|
91
|
+
- `fatal`: 致命错误,程序无法继续运行
|
|
92
|
+
|
|
93
|
+
## 高级用法
|
|
94
|
+
|
|
95
|
+
### 批量记录日志
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
logger.batch([
|
|
99
|
+
{ level: 'info', message: '用户登录', args: [{ username: 'admin' }] },
|
|
100
|
+
{ level: 'warn', message: '密码错误', args: [{ username: 'user123' }] }
|
|
101
|
+
]);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 重新配置
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// 动态更新配置
|
|
108
|
+
logger.reconfig({
|
|
109
|
+
level: 'info',
|
|
110
|
+
is_json: true,
|
|
111
|
+
max_size: 5 * 1024 * 1024 // 5MB
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 日志查询
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
const result = logger.find({
|
|
119
|
+
date: '2023-12-01', // 查询日期
|
|
120
|
+
start_time: '09:00:00', // 起始时间
|
|
121
|
+
end_time: '18:00:00', // 结束时间
|
|
122
|
+
keyword: 'error', // 关键词
|
|
123
|
+
page: 1, // 页码
|
|
124
|
+
size: 50 // 每页大小
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
console.log(result.logs); // 日志列表
|
|
128
|
+
console.log(result.pagination); // 分页信息
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 事件监听
|
|
132
|
+
|
|
133
|
+
```javascript
|
|
134
|
+
// 日志记录前
|
|
135
|
+
logger.on('before_log', (data) => {
|
|
136
|
+
// 可以在这里处理敏感信息脱敏
|
|
137
|
+
console.log('准备记录日志:', data);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// 日志记录后
|
|
141
|
+
logger.on('record:after', (result) => {
|
|
142
|
+
// 可以在这里进行性能监控
|
|
143
|
+
console.log('日志记录完成:', result);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// 日志记录错误
|
|
147
|
+
logger.on('record:error', (error) => {
|
|
148
|
+
console.error('日志记录出错:', error);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// 查询错误
|
|
152
|
+
logger.on('find:error', (error) => {
|
|
153
|
+
console.error('日志查询出错:', error);
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 刷新与销毁
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
// 刷新日志缓存到磁盘
|
|
161
|
+
logger.flush().then(() => {
|
|
162
|
+
console.log('日志已刷新');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// 销毁日志实例
|
|
166
|
+
logger.destroy().then(() => {
|
|
167
|
+
console.log('日志实例已销毁');
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## 日志文件
|
|
172
|
+
|
|
173
|
+
模块自动创建三种类型的日志文件:
|
|
174
|
+
|
|
175
|
+
- `debug_{date}_{index}.log`: 记录 debug、info、success 级别
|
|
176
|
+
- `error_{date}_{index}.log`: 记录 warn、error、fatal 级别
|
|
177
|
+
- `http_{date}_{index}.log`: 记录 HTTP 相关日志
|
|
178
|
+
|
|
179
|
+
当文件大小超过 `max_size` 时,自动创建新文件(索引递增)。
|
|
180
|
+
|
|
181
|
+
## 最佳实践
|
|
182
|
+
|
|
183
|
+
### 1. 全局日志实例
|
|
184
|
+
|
|
185
|
+
```javascript
|
|
186
|
+
// logger.js
|
|
187
|
+
const { Log } = require('mm_logger');
|
|
188
|
+
|
|
189
|
+
const logger = new Log({
|
|
190
|
+
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
|
|
191
|
+
dir: './logs',
|
|
192
|
+
console: true,
|
|
193
|
+
file: true,
|
|
194
|
+
is_json: process.env.NODE_ENV === 'production'
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
module.exports = logger;
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 2. Express 集成
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
const express = require('express');
|
|
204
|
+
const logger = require('./logger');
|
|
205
|
+
const app = express();
|
|
206
|
+
|
|
207
|
+
// HTTP 请求日志中间件
|
|
208
|
+
app.use((req, res, next) => {
|
|
209
|
+
const startTime = Date.now();
|
|
210
|
+
const originalSend = res.send;
|
|
211
|
+
|
|
212
|
+
res.send = function(body) {
|
|
213
|
+
const duration = Date.now() - startTime;
|
|
214
|
+
const logData = {
|
|
215
|
+
method: req.method,
|
|
216
|
+
url: req.url,
|
|
217
|
+
status: res.statusCode,
|
|
218
|
+
duration: duration,
|
|
219
|
+
ip: req.ip
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// 根据状态码记录不同级别
|
|
223
|
+
if (res.statusCode >= 500) {
|
|
224
|
+
logger.http('error', 'HTTP 错误', logData);
|
|
225
|
+
} else if (res.statusCode >= 400) {
|
|
226
|
+
logger.http('warn', 'HTTP 警告', logData);
|
|
227
|
+
} else {
|
|
228
|
+
logger.http('info', 'HTTP 请求', logData);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return originalSend.call(this, body);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
next();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
app.get('/', (req, res) => {
|
|
238
|
+
logger.debug('处理请求', { path: req.path });
|
|
239
|
+
res.send('Hello World');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
app.listen(3000);
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### 3. 错误处理
|
|
246
|
+
|
|
247
|
+
```javascript
|
|
248
|
+
// error-handler.js
|
|
249
|
+
const logger = require('./logger');
|
|
250
|
+
|
|
251
|
+
function handleError(err, req, res, next) {
|
|
252
|
+
logger.error('应用错误', {
|
|
253
|
+
message: err.message,
|
|
254
|
+
stack: process.env.NODE_ENV === 'production' ? '' : err.stack,
|
|
255
|
+
path: req.path,
|
|
256
|
+
method: req.method
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
res.status(500).json({
|
|
260
|
+
error: process.env.NODE_ENV === 'production' ? 'Internal Server Error' : err.message
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
module.exports = handleError;
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## 颜色工具与轻量日志器
|
|
2
268
|
|
|
3
|
-
|
|
269
|
+
`colors` 与轻量日志器 `ConsoleLogger` 已自 `mm_corejs` 迁移至此模块,`mm_logger` 不再依赖 `mm_corejs`。
|
|
270
|
+
|
|
271
|
+
### colors
|
|
272
|
+
|
|
273
|
+
```javascript
|
|
274
|
+
const { colors: lib } = require('mm_logger');
|
|
275
|
+
const c = lib.colors;
|
|
276
|
+
|
|
277
|
+
console.log(c.red('错误'));
|
|
278
|
+
console.log(c.style('bold underline cyan')('组合样式'));
|
|
279
|
+
console.log(c.rgb(255, 128, 0)('真彩色'));
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
| 导出 | 说明 |
|
|
283
|
+
| --- | --- |
|
|
284
|
+
| `colors` | 已按 `process.stdout` 检测好可用性的着色器实例 |
|
|
285
|
+
| `createColors(enabled)` | 按指定开关创建着色器 |
|
|
286
|
+
| `forStream(stream)` | 针对指定流检测并创建着色器 |
|
|
287
|
+
| `supportsColor(stream)` | 判断流是否应启用颜色 |
|
|
288
|
+
| `windowsSupportsVT()` | 判断 Windows 终端是否支持 ANSI/VT |
|
|
289
|
+
| `STYLES` | ANSI 样式表(名称 -> `[开启码, 关闭码]`) |
|
|
290
|
+
|
|
291
|
+
颜色开关遵循 `NO_COLOR`(禁用)、`FORCE_COLOR`(强制,`0` / `false` 表示禁用)、`TERM=dumb`、非 TTY 以及 CI 环境等常见约定。
|
|
292
|
+
|
|
293
|
+
### ConsoleLogger
|
|
294
|
+
|
|
295
|
+
轻量控制台日志器,按级别着色后输出到原生 `console`;`error` / `warn` 走 stderr,其余走 stdout,各自按对应流的 TTY 能力检测颜色。
|
|
296
|
+
|
|
297
|
+
```javascript
|
|
298
|
+
const { ConsoleLogger } = require('mm_logger');
|
|
299
|
+
const logger = new ConsoleLogger();
|
|
300
|
+
|
|
301
|
+
logger.info('普通信息');
|
|
302
|
+
logger.success('成功信息');
|
|
303
|
+
logger.warn('警告信息');
|
|
304
|
+
logger.error('错误信息');
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## 测试
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
npm run test:unit # Jest 单元测试(含覆盖率阈值)
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## 兼容性
|
|
314
|
+
|
|
315
|
+
支持 Node.js 12.x 及以上版本。
|
|
316
|
+
|
|
317
|
+
## 性能
|
|
318
|
+
|
|
319
|
+
- 使用流式写入,避免阻塞主线程
|
|
320
|
+
- 异步日志处理,提高应用响应速度
|
|
321
|
+
- 自动轮转和清理,保持文件系统整洁
|
|
322
|
+
- 优化的文件 I/O,减少磁盘操作开销
|
|
323
|
+
|
|
324
|
+
## 许可证
|
|
325
|
+
|
|
326
|
+
MIT License
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const jsdoc = require('eslint-plugin-jsdoc');
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
files: ['index.js','lib/**/*.js'],
|
|
6
|
+
languageOptions: {
|
|
7
|
+
ecmaVersion: 2020,
|
|
8
|
+
sourceType: 'script'
|
|
9
|
+
},
|
|
10
|
+
plugins: {
|
|
11
|
+
jsdoc: jsdoc
|
|
12
|
+
},
|
|
13
|
+
rules: {
|
|
14
|
+
// JSDoc相关规则 - 设置为error级别强制要求
|
|
15
|
+
'jsdoc/require-jsdoc': ['error', {
|
|
16
|
+
require: {
|
|
17
|
+
FunctionDeclaration: true,
|
|
18
|
+
MethodDefinition: true,
|
|
19
|
+
ClassDeclaration: true,
|
|
20
|
+
ArrowFunctionExpression: true
|
|
21
|
+
}
|
|
22
|
+
}],
|
|
23
|
+
'jsdoc/check-param-names': 'off',
|
|
24
|
+
'jsdoc/check-tag-names': 'off',
|
|
25
|
+
'jsdoc/check-types': 'off',
|
|
26
|
+
'jsdoc/require-param': 'off',
|
|
27
|
+
'jsdoc/require-param-description': 'off',
|
|
28
|
+
'jsdoc/require-returns': 'off',
|
|
29
|
+
'jsdoc/require-returns-description': 'off',
|
|
30
|
+
|
|
31
|
+
// 基础语法规则
|
|
32
|
+
'no-unused-vars': ['error', { args: 'none', vars: 'all' }],
|
|
33
|
+
'no-console': 'warn',
|
|
34
|
+
|
|
35
|
+
// 代码风格规则
|
|
36
|
+
'indent': ['error', 2],
|
|
37
|
+
'quotes': ['error', 'single'],
|
|
38
|
+
'semi': ['error', 'always'],
|
|
39
|
+
'comma-dangle': ['error', 'never'],
|
|
40
|
+
'no-trailing-spaces': 'error',
|
|
41
|
+
'eol-last': 'error',
|
|
42
|
+
'max-len': ['error', { code: 100 }],
|
|
43
|
+
'max-lines-per-function': ['error', { max: 40 }],
|
|
44
|
+
'complexity': ['error', 12],
|
|
45
|
+
'max-depth': ['error', 4],
|
|
46
|
+
'max-params': ['error', 4],
|
|
47
|
+
|
|
48
|
+
// 命名规则
|
|
49
|
+
'id-length': ['error', {
|
|
50
|
+
min: 1,
|
|
51
|
+
max: 20,
|
|
52
|
+
properties: 'always'
|
|
53
|
+
}]
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
files: ['test/**/*.js'],
|
|
58
|
+
languageOptions: {
|
|
59
|
+
ecmaVersion: 2020,
|
|
60
|
+
sourceType: 'script'
|
|
61
|
+
},
|
|
62
|
+
rules: {
|
|
63
|
+
// 测试文件中允许使用console
|
|
64
|
+
'no-console': 'off',
|
|
65
|
+
'no-unused-vars': 'off'
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
];
|
package/example/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mm_logger 日志模块示例
|
|
3
|
+
* 演示 Logger 多级别日志输出、配置修改、loggerAdmin() 作用域工厂,
|
|
4
|
+
* 以及 ConsoleLogger 轻量控制台日志器。默认仅控制台输出,无需外部服务。
|
|
5
|
+
* 运行:node example/index.js
|
|
6
|
+
*/
|
|
7
|
+
const { Logger, ConsoleLogger, LEVEL, loggerAdmin } = require('../index.js');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 主流程
|
|
11
|
+
*/
|
|
12
|
+
function main() {
|
|
13
|
+
// 方式1:创建日志实例,各级别日志输出到控制台
|
|
14
|
+
const log = new Logger({ level: 'debug' });
|
|
15
|
+
log.debug('debug 级别日志');
|
|
16
|
+
log.info('info 级别日志');
|
|
17
|
+
log.success('success 级别日志');
|
|
18
|
+
log.warn('warn 级别日志');
|
|
19
|
+
log.error('error 级别日志', { code: 500 });
|
|
20
|
+
|
|
21
|
+
// 动态修改配置(如切换级别)
|
|
22
|
+
log.setConfig({ level: 'warn' });
|
|
23
|
+
console.log('当前日志级别:', log.config.level);
|
|
24
|
+
|
|
25
|
+
// 方式2:作用域工厂获取日志实例
|
|
26
|
+
const scoped = loggerAdmin('os');
|
|
27
|
+
console.log('工厂实例是 Logger 类型:', scoped instanceof Logger);
|
|
28
|
+
|
|
29
|
+
// 日志级别枚举
|
|
30
|
+
console.log('日志级别枚举:', JSON.stringify(LEVEL));
|
|
31
|
+
|
|
32
|
+
// 方式3:轻量控制台日志器
|
|
33
|
+
const cl = new ConsoleLogger();
|
|
34
|
+
cl.info('ConsoleLogger info');
|
|
35
|
+
cl.success('ConsoleLogger success');
|
|
36
|
+
cl.warn('ConsoleLogger warn');
|
|
37
|
+
cl.error('ConsoleLogger error');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
main();
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 基础用法示例:创建日志实例、记录各级别日志、动态更新配置
|
|
3
|
+
* @example 运行方式:node examples/basic.js
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { Logger, getLogger, LEVEL } = require('../index');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 创建日志实例
|
|
10
|
+
* @returns {Logger} - 日志实例
|
|
11
|
+
*/
|
|
12
|
+
function createLogger() {
|
|
13
|
+
return new Logger({
|
|
14
|
+
level: 'debug',
|
|
15
|
+
dir: './logs',
|
|
16
|
+
console: true,
|
|
17
|
+
file: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 记录各级别日志
|
|
23
|
+
* @param {Logger} logger - 日志实例
|
|
24
|
+
*/
|
|
25
|
+
function logAllLevels(logger) {
|
|
26
|
+
logger.debug('调试信息');
|
|
27
|
+
logger.info('普通信息');
|
|
28
|
+
logger.success('成功信息');
|
|
29
|
+
logger.warn('警告信息');
|
|
30
|
+
logger.error('错误信息');
|
|
31
|
+
logger.fatal('致命错误');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 记录带附加参数的日志
|
|
36
|
+
* @param {Logger} logger - 日志实例
|
|
37
|
+
*/
|
|
38
|
+
function logWithArgs(logger) {
|
|
39
|
+
logger.info('用户登录成功', { username: 'admin', ip: '127.0.0.1' });
|
|
40
|
+
logger.log('warn', '自定义级别日志', { code: 1001, retry: 3 });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 动态更新配置
|
|
45
|
+
* @param {Logger} logger - 日志实例
|
|
46
|
+
*/
|
|
47
|
+
function updateConfig(logger) {
|
|
48
|
+
logger.setConfig({
|
|
49
|
+
level: 'info',
|
|
50
|
+
console_format: '{time} [{level}] {msg}'
|
|
51
|
+
});
|
|
52
|
+
logger.info('配置已更新为 info 级别');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 直接创建 Logger 实例
|
|
56
|
+
const logger = createLogger();
|
|
57
|
+
|
|
58
|
+
// 记录日志
|
|
59
|
+
logAllLevels(logger);
|
|
60
|
+
logWithArgs(logger);
|
|
61
|
+
|
|
62
|
+
// 动态更新配置
|
|
63
|
+
updateConfig(logger);
|
|
64
|
+
|
|
65
|
+
// 查看日志级别枚举
|
|
66
|
+
console.log('日志级别枚举:', LEVEL);
|
|
67
|
+
|
|
68
|
+
// 使用 getLogger 获取全局单例(file: false,避免与上面的实例产生文件冲突)
|
|
69
|
+
const global_logger = getLogger({ level: 'info', dir: './logs', file: false });
|
|
70
|
+
global_logger.info('全局单例日志');
|
package/examples/http.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description HTTP 日志示例:模拟 HTTP 请求日志的记录与查询
|
|
3
|
+
* @example 运行方式:node examples/http.js
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { Logger } = require('../index');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 创建日志实例
|
|
10
|
+
* @returns {Logger} - 日志实例
|
|
11
|
+
*/
|
|
12
|
+
function createLogger() {
|
|
13
|
+
return new Logger({
|
|
14
|
+
level: 'debug',
|
|
15
|
+
dir: './logs',
|
|
16
|
+
console: true,
|
|
17
|
+
file: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 模拟处理一次 HTTP 请求
|
|
23
|
+
* @param {Logger} logger - 日志实例
|
|
24
|
+
* @param {string} method - 请求方法
|
|
25
|
+
* @param {string} url - 请求路径
|
|
26
|
+
* @param {number} status - 响应状态码
|
|
27
|
+
* @param {number} duration - 请求耗时(毫秒)
|
|
28
|
+
*/
|
|
29
|
+
function handleRequest(logger, method, url, status, duration) {
|
|
30
|
+
const log_data = {
|
|
31
|
+
method,
|
|
32
|
+
url,
|
|
33
|
+
status,
|
|
34
|
+
duration,
|
|
35
|
+
ip: '127.0.0.1'
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
if (status >= 500) {
|
|
39
|
+
logger.http('error', 'HTTP 服务器错误', log_data);
|
|
40
|
+
} else if (status >= 400) {
|
|
41
|
+
logger.http('warn', 'HTTP 客户端错误', log_data);
|
|
42
|
+
} else {
|
|
43
|
+
logger.http('info', 'HTTP 请求', log_data);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 查询 HTTP 日志
|
|
49
|
+
* @param {Logger} logger - 日志实例
|
|
50
|
+
*/
|
|
51
|
+
function findHttpLogs(logger) {
|
|
52
|
+
const result = logger.find({
|
|
53
|
+
keyword: 'HTTP',
|
|
54
|
+
level: 'info',
|
|
55
|
+
page_now: 1,
|
|
56
|
+
page_size: 10
|
|
57
|
+
});
|
|
58
|
+
console.log('HTTP 日志查询结果:', result);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const logger = createLogger();
|
|
62
|
+
|
|
63
|
+
// 模拟若干 HTTP 请求
|
|
64
|
+
handleRequest(logger, 'GET', '/api/users', 200, 12);
|
|
65
|
+
handleRequest(logger, 'POST', '/api/users', 400, 5);
|
|
66
|
+
handleRequest(logger, 'GET', '/api/orders', 500, 100);
|
|
67
|
+
|
|
68
|
+
// 等待日志写入完成后查询
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
findHttpLogs(logger);
|
|
71
|
+
}, 500);
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description 日志查询与管理示例:find、read、clear、remove
|
|
3
|
+
* @example 运行方式:node examples/query.js
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { Logger } = require('../index');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 创建日志实例
|
|
10
|
+
* @returns {Logger} - 日志实例
|
|
11
|
+
*/
|
|
12
|
+
function createLogger() {
|
|
13
|
+
return new Logger({
|
|
14
|
+
level: 'debug',
|
|
15
|
+
dir: './logs',
|
|
16
|
+
console: true,
|
|
17
|
+
file: true
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 写入示例日志
|
|
23
|
+
* @param {Logger} logger - 日志实例
|
|
24
|
+
*/
|
|
25
|
+
function writeLogs(logger) {
|
|
26
|
+
logger.info('用户创建成功', { user_id: 1 });
|
|
27
|
+
logger.info('用户更新成功', { user_id: 2 });
|
|
28
|
+
logger.warn('密码重试次数过多', { user_id: 1 });
|
|
29
|
+
logger.error('数据库连接失败', { host: '127.0.0.1' });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 按条件查询日志
|
|
34
|
+
* @param {Logger} logger - 日志实例
|
|
35
|
+
*/
|
|
36
|
+
function findLogs(logger) {
|
|
37
|
+
const result = logger.find({
|
|
38
|
+
keyword: '用户',
|
|
39
|
+
level: 'info',
|
|
40
|
+
page_now: 1,
|
|
41
|
+
page_size: 10
|
|
42
|
+
});
|
|
43
|
+
console.log('find 查询结果:', result);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 读取日志内容
|
|
48
|
+
* @param {Logger} logger - 日志实例
|
|
49
|
+
*/
|
|
50
|
+
function readLogs(logger) {
|
|
51
|
+
const logs = logger.read('debug', '用户');
|
|
52
|
+
console.log('read 读取结果:', logs);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 按关键词清空日志
|
|
57
|
+
* @param {Logger} logger - 日志实例
|
|
58
|
+
*/
|
|
59
|
+
function clearLogs(logger) {
|
|
60
|
+
const result = logger.clear('debug', '数据库');
|
|
61
|
+
console.log('clear 清空结果:', result);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 删除指定类型日志文件
|
|
66
|
+
* @param {Logger} logger - 日志实例
|
|
67
|
+
*/
|
|
68
|
+
function removeLogs(logger) {
|
|
69
|
+
const result = logger.remove('debug');
|
|
70
|
+
console.log('remove 删除结果:', result);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const logger = createLogger();
|
|
74
|
+
|
|
75
|
+
// 写入示例日志
|
|
76
|
+
writeLogs(logger);
|
|
77
|
+
|
|
78
|
+
// 等待日志写入完成后执行查询与管理操作
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
findLogs(logger);
|
|
81
|
+
readLogs(logger);
|
|
82
|
+
clearLogs(logger);
|
|
83
|
+
removeLogs(logger);
|
|
84
|
+
}, 500);
|