@foxford/logger 1.0.2 → 1.2.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/browser.js +306 -400
- package/browser.mjs +309 -399
- package/index.d.ts +170 -11
- package/node.js +271 -373
- package/node.mjs +274 -372
- package/package.json +12 -11
package/node.js
CHANGED
|
@@ -1,426 +1,324 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Генерирует hex-код цвета на основе строки, избегая оттенков красного
|
|
8
|
-
* @param {string} str - Строка, для которой нужно сгенерировать цвет
|
|
9
|
-
* @returns {string} - Hex-код цвета
|
|
10
|
-
*/
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const log = require("loglevel");
|
|
4
|
+
const chalk = require("chalk");
|
|
11
5
|
function generateHexByString(str) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
const m = lightness / 100 - chroma / 2;
|
|
45
|
-
const [r, g, b] = [r1, g1, b1].map((v) => Math.round((v + m) * 255));
|
|
46
|
-
// Добавляем проверку и значения по умолчанию
|
|
47
|
-
const rValue = r !== null && r !== void 0 ? r : 0;
|
|
48
|
-
const gValue = g !== null && g !== void 0 ? g : 0;
|
|
49
|
-
const bValue = b !== null && b !== void 0 ? b : 0;
|
|
50
|
-
const color = `#${((rValue << 16) | (gValue << 8) | bValue).toString(16).padStart(6, '0')}`;
|
|
51
|
-
return color;
|
|
6
|
+
let hash = 0;
|
|
7
|
+
for (let i = 0; i < str.length; i++) {
|
|
8
|
+
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
|
9
|
+
}
|
|
10
|
+
const hue = Math.abs(hash) % 300;
|
|
11
|
+
const saturation = 60 + Math.abs(hash) % 40;
|
|
12
|
+
const lightness = 30 + Math.abs(hash) % 40;
|
|
13
|
+
const chroma = (1 - Math.abs(2 * lightness / 100 - 1)) * saturation / 100;
|
|
14
|
+
const huePrime = hue / 60;
|
|
15
|
+
const x = chroma * (1 - Math.abs(huePrime % 2 - 1));
|
|
16
|
+
let r1 = 0, g1 = 0, b1 = 0;
|
|
17
|
+
if (huePrime >= 0 && huePrime < 1) {
|
|
18
|
+
[r1, g1, b1] = [chroma, x, 0];
|
|
19
|
+
} else if (huePrime >= 1 && huePrime < 2) {
|
|
20
|
+
[r1, g1, b1] = [x, chroma, 0];
|
|
21
|
+
} else if (huePrime >= 2 && huePrime < 3) {
|
|
22
|
+
[r1, g1, b1] = [0, chroma, x];
|
|
23
|
+
} else if (huePrime >= 3 && huePrime < 4) {
|
|
24
|
+
[r1, g1, b1] = [0, x, chroma];
|
|
25
|
+
} else if (huePrime >= 4 && huePrime < 5) {
|
|
26
|
+
[r1, g1, b1] = [x, 0, chroma];
|
|
27
|
+
} else {
|
|
28
|
+
[r1, g1, b1] = [chroma, 0, x];
|
|
29
|
+
}
|
|
30
|
+
const m = lightness / 100 - chroma / 2;
|
|
31
|
+
const [r, g, b] = [r1, g1, b1].map((v) => Math.round((v + m) * 255));
|
|
32
|
+
const rValue = r ?? 0;
|
|
33
|
+
const gValue = g ?? 0;
|
|
34
|
+
const bValue = b ?? 0;
|
|
35
|
+
const color = `#${(rValue << 16 | gValue << 8 | bValue).toString(16).padStart(6, "0")}`;
|
|
36
|
+
return color;
|
|
52
37
|
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Кеш для хранения сгенерированных цветов
|
|
56
|
-
* могут быть заранее предустановлены по имени логгера
|
|
57
|
-
**/
|
|
58
38
|
const colorCache = {};
|
|
59
|
-
/** Цвета для различных уровней логирования */
|
|
60
39
|
const levelColors = {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
40
|
+
DEBUG: chalk.cyan,
|
|
41
|
+
ERROR: chalk.red,
|
|
42
|
+
INFO: chalk.green,
|
|
43
|
+
LOG: chalk.cyan,
|
|
44
|
+
TRACE: chalk.gray,
|
|
45
|
+
WARN: chalk.yellow
|
|
67
46
|
};
|
|
68
|
-
|
|
69
|
-
const debugStorage = new Set();
|
|
70
|
-
/**
|
|
71
|
-
* Генерирует hex-код цвета на основе строки, избегая оттенков красного
|
|
72
|
-
* @param {string} str - Строка, для которой нужно сгенерировать цвет
|
|
73
|
-
* @returns {string} - Hex-код цвета
|
|
74
|
-
*/
|
|
47
|
+
const debugStorage = /* @__PURE__ */ new Set();
|
|
75
48
|
function stringToColorCode(str) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// Сохраняем цвет в кеш
|
|
83
|
-
colorCache[str] = color;
|
|
84
|
-
return color;
|
|
49
|
+
if (str in colorCache) {
|
|
50
|
+
return colorCache[str] ?? "inherit";
|
|
51
|
+
}
|
|
52
|
+
const color = generateHexByString(str);
|
|
53
|
+
colorCache[str] = color;
|
|
54
|
+
return color;
|
|
85
55
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Форматирует сообщение лога
|
|
88
|
-
* @param {string} level - Уровень лога
|
|
89
|
-
* @param {string} name - Имя логгера
|
|
90
|
-
* @param {Date} timestamp - Временная метка
|
|
91
|
-
* @returns {string} Отформатированное сообщение
|
|
92
|
-
*/
|
|
93
56
|
function formatter(level, name, timestamp) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
57
|
+
const levelColor = levelColors[level.toUpperCase()] || chalk.gray;
|
|
58
|
+
let date;
|
|
59
|
+
let nameHex;
|
|
60
|
+
let loggerName;
|
|
61
|
+
let loggerLevel;
|
|
62
|
+
switch (name) {
|
|
63
|
+
// предустановленнный цветовой шаблон по имени логгера
|
|
64
|
+
case "critical":
|
|
65
|
+
date = chalk.red(`[${timestamp.toISOString()}]`);
|
|
66
|
+
loggerName = chalk.red(`[${name}]`);
|
|
67
|
+
loggerLevel = chalk.red(`[${level}]`);
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
date = chalk.gray(`[${timestamp.toISOString()}]`);
|
|
71
|
+
nameHex = stringToColorCode(name);
|
|
72
|
+
loggerName = chalk.hex(nameHex)(`[${name}]`);
|
|
73
|
+
loggerLevel = levelColor(`[${level}]`);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
return `${date} ${loggerLevel} ${loggerName} ${chalk.cyan("•")}`;
|
|
114
77
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Получает текущее значение debug
|
|
117
|
-
* @returns {string | undefined} Строка с debug значениями или undefined, если значений нет
|
|
118
|
-
*/
|
|
119
78
|
function getDebugValue() {
|
|
120
|
-
|
|
121
|
-
|
|
79
|
+
const value = Array.from(debugStorage).join(",");
|
|
80
|
+
return value.length ? value : void 0;
|
|
122
81
|
}
|
|
123
|
-
/**
|
|
124
|
-
* Устанавливает значение debug
|
|
125
|
-
* @param {string | null} value - Новое значение debug
|
|
126
|
-
*/
|
|
127
82
|
function setDebugValue(value) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
83
|
+
if (value === null || value === void 0) {
|
|
84
|
+
debugStorage.clear();
|
|
85
|
+
} else {
|
|
86
|
+
debugStorage.add(value.trim());
|
|
87
|
+
}
|
|
134
88
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Функция для подписки на изменения значения debug
|
|
137
|
-
* @param {function} callback - Функция, вызываемая при изменении значения debug
|
|
138
|
-
* @returns {function} Функция для отписки от изменений
|
|
139
|
-
*/
|
|
140
89
|
function onDebugValueChange(_callback) {
|
|
141
|
-
|
|
142
|
-
|
|
90
|
+
return () => {
|
|
91
|
+
};
|
|
143
92
|
}
|
|
144
93
|
if (process.env.DEBUG) {
|
|
145
|
-
|
|
94
|
+
setDebugValue(process.env.DEBUG);
|
|
146
95
|
}
|
|
147
96
|
const environment = {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
97
|
+
formatter,
|
|
98
|
+
getDebugValue,
|
|
99
|
+
onDebugValueChange,
|
|
100
|
+
setDebugValue
|
|
152
101
|
};
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Генерирует UUID версии 4.
|
|
156
|
-
* @returns {string} Строка, представляющая UUID версии 4.
|
|
157
|
-
*/
|
|
158
102
|
function generateUUIDv4() {
|
|
159
|
-
|
|
103
|
+
return "10000000-1000-4000-8000-100000000000".replace(
|
|
104
|
+
/[018]/g,
|
|
105
|
+
(char) => (
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
107
|
+
(parseInt(char, 10) ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> parseInt(char, 10) / 4).toString(
|
|
108
|
+
16
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
);
|
|
160
112
|
}
|
|
161
|
-
|
|
162
|
-
/*
|
|
163
|
-
const loggerCache = new Map();
|
|
164
|
-
const previousLevels = new Map();
|
|
113
|
+
const loggerCache = /* @__PURE__ */ new Map();
|
|
114
|
+
const previousLevels = /* @__PURE__ */ new Map();
|
|
165
115
|
let isInitialized = false;
|
|
166
|
-
/**
|
|
167
|
-
* Создает экземпляр HierarchicalLogger
|
|
168
|
-
* @param fullName Имя логгера
|
|
169
|
-
* @param parent Родительский логгер (если есть)
|
|
170
|
-
*/
|
|
171
116
|
function createHierarchicalLogger(originalGetLogger, fullName, parent) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
newLevel = previousLevels.get(this.id) || log.levels.WARN;
|
|
223
|
-
}
|
|
224
|
-
baseLogger.setLevel(newLevel, false);
|
|
225
|
-
previousLevels.delete(this.id);
|
|
226
|
-
// Если выключаем отладку
|
|
227
|
-
const index = currentPatterns.findIndex((pattern) => pattern === fullName || pattern === `${fullName}:*`);
|
|
228
|
-
if (index !== -1) {
|
|
229
|
-
currentPatterns.splice(index, 1);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
// Оптимизируем паттерны
|
|
233
|
-
const optimizedPatterns = optimizePatterns(currentPatterns);
|
|
234
|
-
// Сохраняем оптимизированные паттерны
|
|
235
|
-
environment.setDebugValue(optimizedPatterns.join(',') || null);
|
|
236
|
-
},
|
|
237
|
-
getLogger(name) {
|
|
238
|
-
const childLogger = createHierarchicalLogger(originalGetLogger, `${fullName}:${name}`, this);
|
|
239
|
-
this.children.add(childLogger);
|
|
240
|
-
return childLogger;
|
|
241
|
-
},
|
|
242
|
-
setLevel(level) {
|
|
243
|
-
baseLogger.setLevel(level, false);
|
|
244
|
-
// Обновляем уровень для всех дочерних логгеров
|
|
245
|
-
this.children.forEach((child) => child.setLevel(level, false));
|
|
246
|
-
// Если логгер в режиме отладки, сохраняем новый уровень
|
|
247
|
-
if (this.isDebugEnabled()) {
|
|
248
|
-
previousLevels.set(loggerId, level);
|
|
249
|
-
}
|
|
250
|
-
} });
|
|
251
|
-
const originalFactory = baseLogger.methodFactory;
|
|
252
|
-
// Переопределяем методы логирования для учета режима отладки
|
|
253
|
-
const logMethods = ['trace', 'debug', 'info', 'warn', 'error', 'log'];
|
|
254
|
-
logMethods.forEach((method) => {
|
|
255
|
-
const originalMethod = originalFactory(method, baseLogger.getLevel(), fullName);
|
|
256
|
-
hierarchicalLogger[method] = function (...args) {
|
|
257
|
-
var _a;
|
|
258
|
-
const debugEnabled = this.isDebugEnabled();
|
|
259
|
-
const messageLevel = (_a = log.levels[method.toUpperCase()]) !== null && _a !== void 0 ? _a : 0;
|
|
260
|
-
const currentLevel = baseLogger.getLevel();
|
|
261
|
-
if (debugEnabled || messageLevel >= currentLevel) {
|
|
262
|
-
return originalMethod.apply(baseLogger, args);
|
|
117
|
+
const loggerId = generateUUIDv4();
|
|
118
|
+
const baseLogger = originalGetLogger(fullName);
|
|
119
|
+
const name = parent ? fullName.slice(parent.getFullName().length + 1) : fullName;
|
|
120
|
+
const hierarchicalLogger = {
|
|
121
|
+
...baseLogger,
|
|
122
|
+
children: /* @__PURE__ */ new Set(),
|
|
123
|
+
debugEnabled: false,
|
|
124
|
+
getDebugPattern() {
|
|
125
|
+
return environment.getDebugValue() ?? null;
|
|
126
|
+
},
|
|
127
|
+
// Добавим вспомогательный метод для получения полного имени логгера
|
|
128
|
+
getFullName() {
|
|
129
|
+
if (!this.parent) {
|
|
130
|
+
return this.name;
|
|
131
|
+
}
|
|
132
|
+
const parentFullName = this.parent.getFullName();
|
|
133
|
+
return parentFullName ? `${parentFullName}:${this.name}` : this.name;
|
|
134
|
+
},
|
|
135
|
+
getLogger(name2) {
|
|
136
|
+
for (const child of this.children) {
|
|
137
|
+
if (child.name === name2) {
|
|
138
|
+
return child;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const childLogger = createHierarchicalLogger(originalGetLogger, `${fullName}:${name2}`, this);
|
|
142
|
+
this.children.add(childLogger);
|
|
143
|
+
return childLogger;
|
|
144
|
+
},
|
|
145
|
+
id: loggerId,
|
|
146
|
+
isDebugEnabled() {
|
|
147
|
+
return this.debugEnabled;
|
|
148
|
+
},
|
|
149
|
+
name,
|
|
150
|
+
parent: parent ?? null,
|
|
151
|
+
setDebug(enabled) {
|
|
152
|
+
this.debugEnabled = enabled;
|
|
153
|
+
const parentLevel = this.parent ? this.parent.getLevel() : void 0;
|
|
154
|
+
const currentPatterns = (environment.getDebugValue() || "").split(",").filter(Boolean);
|
|
155
|
+
const fullName2 = this.getFullName();
|
|
156
|
+
if (enabled) {
|
|
157
|
+
if (!previousLevels.has(this.id)) {
|
|
158
|
+
previousLevels.set(this.id, baseLogger.getLevel());
|
|
159
|
+
}
|
|
160
|
+
baseLogger.setLevel(log.levels.TRACE, false);
|
|
161
|
+
if (!currentPatterns.some((pattern) => fullName2 === pattern || `${fullName2}:*` === pattern)) {
|
|
162
|
+
const childrenPatterns = currentPatterns.filter((pattern) => pattern.startsWith(`${fullName2}:`));
|
|
163
|
+
childrenPatterns.forEach((pattern) => {
|
|
164
|
+
const index = currentPatterns.indexOf(pattern);
|
|
165
|
+
if (index !== -1) {
|
|
166
|
+
currentPatterns.splice(index, 1);
|
|
263
167
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
168
|
+
});
|
|
169
|
+
currentPatterns.push(fullName2);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
let newLevel;
|
|
173
|
+
if (parentLevel !== void 0) {
|
|
174
|
+
newLevel = parentLevel;
|
|
175
|
+
} else {
|
|
176
|
+
newLevel = previousLevels.get(this.id) || log.levels.WARN;
|
|
177
|
+
}
|
|
178
|
+
baseLogger.setLevel(newLevel, false);
|
|
179
|
+
previousLevels.delete(this.id);
|
|
180
|
+
const index = currentPatterns.findIndex((pattern) => pattern === fullName2 || pattern === `${fullName2}:*`);
|
|
181
|
+
if (index !== -1) {
|
|
182
|
+
currentPatterns.splice(index, 1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const optimizedPatterns = optimizePatterns(currentPatterns);
|
|
186
|
+
environment.setDebugValue(optimizedPatterns.join(",") || null);
|
|
187
|
+
},
|
|
188
|
+
setLevel(level) {
|
|
189
|
+
baseLogger.setLevel(level, false);
|
|
190
|
+
this.children.forEach((child) => child.setLevel(level, false));
|
|
191
|
+
if (this.isDebugEnabled()) {
|
|
192
|
+
previousLevels.set(loggerId, level);
|
|
193
|
+
}
|
|
278
194
|
}
|
|
279
|
-
|
|
195
|
+
};
|
|
196
|
+
const originalFactory = baseLogger.methodFactory;
|
|
197
|
+
const logMethods = ["trace", "debug", "info", "warn", "error", "log"];
|
|
198
|
+
logMethods.forEach((method) => {
|
|
199
|
+
const originalMethod = originalFactory(method, baseLogger.getLevel(), fullName);
|
|
200
|
+
hierarchicalLogger[method] = function(...args) {
|
|
201
|
+
const debugEnabled = this.isDebugEnabled();
|
|
202
|
+
const messageLevel = log.levels[method.toUpperCase()] ?? 0;
|
|
203
|
+
const currentLevel = baseLogger.getLevel();
|
|
204
|
+
if (debugEnabled || messageLevel >= currentLevel) {
|
|
205
|
+
return originalMethod.apply(baseLogger, args);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
loggerCache.set(loggerId, hierarchicalLogger);
|
|
210
|
+
if (!isInitialized) {
|
|
211
|
+
isInitialized = true;
|
|
212
|
+
initializeDebugPatterns();
|
|
213
|
+
} else {
|
|
214
|
+
const debugPattern = environment.getDebugValue() || "";
|
|
215
|
+
const patterns = debugPattern.split(",").map((p) => p.trim()).filter(Boolean);
|
|
216
|
+
configureLogger(hierarchicalLogger, patterns);
|
|
217
|
+
}
|
|
218
|
+
return hierarchicalLogger;
|
|
280
219
|
}
|
|
281
|
-
/**
|
|
282
|
-
* Оптимизирует паттерны отладки
|
|
283
|
-
* @param patterns Массив паттернов отладки
|
|
284
|
-
* @returns Оптимизированный массив паттернов
|
|
285
|
-
*/
|
|
286
220
|
function optimizePatterns(patterns) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (!isRedundant) {
|
|
299
|
-
optimized.add(pattern);
|
|
300
|
-
}
|
|
221
|
+
const optimized = /* @__PURE__ */ new Set();
|
|
222
|
+
patterns.sort((a, b) => a.split(":").length - b.split(":").length);
|
|
223
|
+
for (const pattern of patterns) {
|
|
224
|
+
let isRedundant = false;
|
|
225
|
+
for (const existingPattern of optimized) {
|
|
226
|
+
if (pattern === existingPattern || pattern.startsWith(existingPattern + ":")) {
|
|
227
|
+
isRedundant = true;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
301
230
|
}
|
|
302
|
-
|
|
231
|
+
if (!isRedundant) {
|
|
232
|
+
optimized.add(pattern);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return Array.from(optimized);
|
|
303
236
|
}
|
|
304
|
-
/**
|
|
305
|
-
* Проверяет, должен ли логгер быть в режиме отладки
|
|
306
|
-
* @param fullName Полное имя логгера
|
|
307
|
-
* @param patterns Массив паттернов отладки
|
|
308
|
-
* @returns true, если логгер должен быть в режиме отладки
|
|
309
|
-
*/
|
|
310
237
|
function shouldEnableDebug(fullName, patterns) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
return false;
|
|
321
|
-
});
|
|
238
|
+
return patterns.some((pattern) => {
|
|
239
|
+
if (pattern === "*") return true;
|
|
240
|
+
if (fullName === pattern) return true;
|
|
241
|
+
if (pattern.endsWith(":*")) {
|
|
242
|
+
const patternPrefix = pattern.slice(0, -2);
|
|
243
|
+
return fullName.startsWith(patternPrefix + ":");
|
|
244
|
+
}
|
|
245
|
+
return false;
|
|
246
|
+
});
|
|
322
247
|
}
|
|
323
|
-
/**
|
|
324
|
-
* Настраивает логгер в соответствии с текущими паттернами отладки
|
|
325
|
-
* @param logger Логгер для настройки
|
|
326
|
-
* @param patterns Массив паттернов отладки
|
|
327
|
-
*/
|
|
328
248
|
function configureLogger(logger, patterns) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
}
|
|
249
|
+
const fullName = logger.getFullName();
|
|
250
|
+
const debugEnabled = shouldEnableDebug(fullName, patterns);
|
|
251
|
+
logger.debugEnabled = debugEnabled;
|
|
252
|
+
if (debugEnabled) {
|
|
253
|
+
logger.setLevel(previousLevels.get(logger.id) || log.levels.TRACE);
|
|
254
|
+
} else {
|
|
255
|
+
logger.setLevel(previousLevels.get(logger.id) || log.levels.WARN);
|
|
256
|
+
}
|
|
338
257
|
}
|
|
339
|
-
/**
|
|
340
|
-
* Инициализирует паттерны отладки из environment
|
|
341
|
-
*/
|
|
342
258
|
function initializeDebugPatterns() {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
logger.children.forEach(processLogger);
|
|
357
|
-
}
|
|
358
|
-
// Обрабатываем все существующие логгеры
|
|
359
|
-
loggerCache.forEach(processLogger);
|
|
360
|
-
// Обрабатываем все существующие логгеры
|
|
361
|
-
Array.from(loggerCache).forEach(([, logger]) => {
|
|
362
|
-
processLogger(logger);
|
|
363
|
-
});
|
|
259
|
+
const debugPattern = environment.getDebugValue() || "";
|
|
260
|
+
const patterns = debugPattern.split(",").map((p) => p.trim()).filter(Boolean);
|
|
261
|
+
const processedLoggers = /* @__PURE__ */ new Set();
|
|
262
|
+
function processLogger(logger) {
|
|
263
|
+
if (processedLoggers.has(logger.id)) return;
|
|
264
|
+
processedLoggers.add(logger.id);
|
|
265
|
+
configureLogger(logger, patterns);
|
|
266
|
+
logger.children.forEach(processLogger);
|
|
267
|
+
}
|
|
268
|
+
loggerCache.forEach(processLogger);
|
|
269
|
+
Array.from(loggerCache).forEach(([, logger]) => {
|
|
270
|
+
processLogger(logger);
|
|
271
|
+
});
|
|
364
272
|
}
|
|
365
|
-
/**
|
|
366
|
-
* Плагин иерархического логгера для loglevel
|
|
367
|
-
*/
|
|
368
273
|
const hierarchicalPlugin = {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
274
|
+
apply(rootLogger) {
|
|
275
|
+
const originalGetLogger = rootLogger.getLogger.bind(rootLogger);
|
|
276
|
+
const rootChildren = /* @__PURE__ */ new Map();
|
|
277
|
+
rootLogger.getLogger = (name) => {
|
|
278
|
+
let logger = rootChildren.get(name);
|
|
279
|
+
if (!logger) {
|
|
280
|
+
logger = createHierarchicalLogger(originalGetLogger, name);
|
|
281
|
+
rootChildren.set(name, logger);
|
|
282
|
+
}
|
|
283
|
+
return logger;
|
|
284
|
+
};
|
|
285
|
+
}
|
|
376
286
|
};
|
|
377
|
-
|
|
378
287
|
const defaultOptions = {
|
|
379
|
-
|
|
288
|
+
format: (level, name, timestamp) => `[${timestamp.toISOString()}] [${level}] [${name}]`
|
|
380
289
|
};
|
|
381
|
-
/**
|
|
382
|
-
* Плагин для добавления префикса к логам
|
|
383
|
-
* @param logger Инстанс логгера
|
|
384
|
-
* @param options Опции плагина
|
|
385
|
-
*/
|
|
386
290
|
function prefix(logger, options = {}) {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
}
|
|
401
|
-
};
|
|
291
|
+
const mergedOptions = { ...defaultOptions, ...options };
|
|
292
|
+
const originalFactory = logger.methodFactory;
|
|
293
|
+
logger.methodFactory = function(methodName, logLevel, loggerName) {
|
|
294
|
+
const rawMethod = originalFactory(methodName, logLevel, loggerName);
|
|
295
|
+
return function(...args) {
|
|
296
|
+
const level = methodName.toUpperCase();
|
|
297
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
298
|
+
const prefix2 = mergedOptions.format(level, typeof loggerName === "string" ? loggerName : "", timestamp);
|
|
299
|
+
if (Array.isArray(prefix2)) {
|
|
300
|
+
rawMethod.apply(this, [...prefix2, ...args]);
|
|
301
|
+
} else {
|
|
302
|
+
rawMethod.apply(this, [prefix2, ...args]);
|
|
303
|
+
}
|
|
402
304
|
};
|
|
403
|
-
|
|
305
|
+
};
|
|
306
|
+
return logger;
|
|
404
307
|
}
|
|
405
308
|
const prefixPlugin = {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
309
|
+
apply(rootLogger, options = {}) {
|
|
310
|
+
prefix(rootLogger, options);
|
|
311
|
+
}
|
|
409
312
|
};
|
|
410
|
-
|
|
411
|
-
// Применяем плагины
|
|
412
313
|
hierarchicalPlugin.apply(log);
|
|
413
314
|
prefixPlugin.apply(log, {
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
315
|
+
format: (level, name, timestamp) => {
|
|
316
|
+
return environment.formatter(level, name, timestamp);
|
|
317
|
+
}
|
|
417
318
|
});
|
|
418
|
-
// сброс левела чтобы игнорировать запись в сторадже в браузерной имплементации
|
|
419
319
|
log.resetLevel();
|
|
420
|
-
// Пересоздаем методы логгера
|
|
421
320
|
log.rebuild();
|
|
422
321
|
const extendedLog = Object.assign(log, {});
|
|
423
|
-
|
|
424
322
|
exports.hierarchicalPlugin = hierarchicalPlugin;
|
|
425
323
|
exports.log = extendedLog;
|
|
426
324
|
exports.prefixPlugin = prefixPlugin;
|