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