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