@ncoderz/log-m8 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/README.md +48 -9
- package/dist/browser/log-m8.global.js +1 -1
- package/dist/browser/log-m8.global.js.map +1 -1
- package/dist/index.cjs +97 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -7
- package/dist/index.d.ts +23 -7
- package/dist/index.js +96 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -521,13 +521,14 @@ interface PluginFactory<C extends PluginConfig = PluginConfig, P extends Plugin
|
|
|
521
521
|
* Logging.flushAppenders();
|
|
522
522
|
* ```
|
|
523
523
|
*/
|
|
524
|
-
declare class LogM8 {
|
|
524
|
+
declare class LogM8$1 {
|
|
525
525
|
private _initialized;
|
|
526
526
|
private _pluginManager;
|
|
527
527
|
private _loggers;
|
|
528
528
|
private _appenders;
|
|
529
529
|
private _filters;
|
|
530
|
-
private
|
|
530
|
+
private _globalLogLevel;
|
|
531
|
+
private _globalLogLevelNumber;
|
|
531
532
|
private _logLevelValues;
|
|
532
533
|
private _logLevelSet;
|
|
533
534
|
private _logBuffer;
|
|
@@ -601,6 +602,13 @@ declare class LogM8 {
|
|
|
601
602
|
* ```
|
|
602
603
|
*/
|
|
603
604
|
getLogger(name: string | string[]): Log;
|
|
605
|
+
/**
|
|
606
|
+
* Sets the global logging level or a specific logger's level.
|
|
607
|
+
*
|
|
608
|
+
* @param level - New logging level name (e.g., 'info', 'debug', 'off')
|
|
609
|
+
* @param logger - Optional logger name to set level for a specific logger
|
|
610
|
+
*/
|
|
611
|
+
setLevel(level: LogLevelType, logger?: string): void;
|
|
604
612
|
/**
|
|
605
613
|
* Enables an appender to resume processing log events.
|
|
606
614
|
*
|
|
@@ -1251,6 +1259,14 @@ declare class LogM8Utils {
|
|
|
1251
1259
|
* }
|
|
1252
1260
|
*/
|
|
1253
1261
|
static serializeError(error: unknown): SerializedError | null;
|
|
1262
|
+
/**
|
|
1263
|
+
* Take a regex in the format /regex/flags and parse it into a RegExp object
|
|
1264
|
+
*
|
|
1265
|
+
* @param regex regex in the format /regex/flags
|
|
1266
|
+
* @param extraFlags additional flags to apply to the regex
|
|
1267
|
+
* @returns RegExp object or undefined if the regex is invalid
|
|
1268
|
+
*/
|
|
1269
|
+
static parseRegexFromString(regex: string, extraFlags?: string[]): RegExp | undefined;
|
|
1254
1270
|
}
|
|
1255
1271
|
|
|
1256
1272
|
/**
|
|
@@ -1261,16 +1277,16 @@ declare class LogM8Utils {
|
|
|
1261
1277
|
*
|
|
1262
1278
|
* @example
|
|
1263
1279
|
* ```typescript
|
|
1264
|
-
* import {
|
|
1280
|
+
* import { LogM8 } from 'log-m8';
|
|
1265
1281
|
*
|
|
1266
1282
|
* // Initialize with default console output
|
|
1267
|
-
*
|
|
1283
|
+
* LogM8.init();
|
|
1268
1284
|
*
|
|
1269
1285
|
* // Get a logger and start logging
|
|
1270
|
-
* const logger =
|
|
1286
|
+
* const logger = LogM8.getLogger('app');
|
|
1271
1287
|
* logger.info('Application started');
|
|
1272
1288
|
* ```
|
|
1273
1289
|
*/
|
|
1274
|
-
declare const
|
|
1290
|
+
declare const LogM8: LogM8$1;
|
|
1275
1291
|
|
|
1276
|
-
export { type Appender, type AppenderConfig, type ConsoleAppenderConfig, type DefaultFormatterConfig, type FileAppenderConfig, type Filter, type FilterConfig, type Formatter, type FormatterConfig, type Log, type LogContext, LogLevel, type LogLevelType,
|
|
1292
|
+
export { type Appender, type AppenderConfig, type ConsoleAppenderConfig, type DefaultFormatterConfig, type FileAppenderConfig, type Filter, type FilterConfig, type Formatter, type FormatterConfig, type Log, type LogContext, LogLevel, type LogLevelType, LogM8, LogM8Utils, type LoggingConfig, type MatchFilterConfig, type Plugin, type PluginConfig, type PluginFactory, PluginKind, type PluginKindType };
|
package/dist/index.js
CHANGED
|
@@ -117,6 +117,7 @@ import { createWriteStream } from "fs";
|
|
|
117
117
|
|
|
118
118
|
// src/LogM8Utils.ts
|
|
119
119
|
var TIMESTAMP_TOKEN_REGEX = /(yyyy|SSS|hh|mm|ss|SS|zz|z|yy|MM|dd|A|a|h|S)/g;
|
|
120
|
+
var REGEX_MATCHER = /^\/(.+)\/([dgimsuvy]*)$/;
|
|
120
121
|
var EXCLUDED_ERROR_KEYS = /* @__PURE__ */ new Set(["name", "message", "stack", "cause"]);
|
|
121
122
|
var COMMON_NON_ENUMERABLE_PROPS = ["code", "errno", "syscall", "path"];
|
|
122
123
|
var LogM8Utils = class _LogM8Utils {
|
|
@@ -512,6 +513,31 @@ var LogM8Utils = class _LogM8Utils {
|
|
|
512
513
|
};
|
|
513
514
|
return serializeErrorInternal(error, /* @__PURE__ */ new WeakSet());
|
|
514
515
|
}
|
|
516
|
+
/**
|
|
517
|
+
* Take a regex in the format /regex/flags and parse it into a RegExp object
|
|
518
|
+
*
|
|
519
|
+
* @param regex regex in the format /regex/flags
|
|
520
|
+
* @param extraFlags additional flags to apply to the regex
|
|
521
|
+
* @returns RegExp object or undefined if the regex is invalid
|
|
522
|
+
*/
|
|
523
|
+
static parseRegexFromString(regex, extraFlags) {
|
|
524
|
+
try {
|
|
525
|
+
const match = regex.match(REGEX_MATCHER);
|
|
526
|
+
if (match == null) return void 0;
|
|
527
|
+
const [, pattern, flags] = match;
|
|
528
|
+
let finalFlags = flags;
|
|
529
|
+
if (Array.isArray(extraFlags)) {
|
|
530
|
+
for (const flag of extraFlags) {
|
|
531
|
+
if (!flags.includes(flag)) {
|
|
532
|
+
finalFlags += flag;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return new RegExp(pattern, finalFlags);
|
|
537
|
+
} catch (_e) {
|
|
538
|
+
return void 0;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
515
541
|
};
|
|
516
542
|
|
|
517
543
|
// src/appenders/FileAppender.ts
|
|
@@ -612,8 +638,8 @@ var MatchFilter = class {
|
|
|
612
638
|
*/
|
|
613
639
|
init(config) {
|
|
614
640
|
const cfg = config ?? {};
|
|
615
|
-
this._allow = cfg.allow
|
|
616
|
-
this._deny = cfg.deny
|
|
641
|
+
this._allow = this._prepareRules(cfg.allow);
|
|
642
|
+
this._deny = this._prepareRules(cfg.deny);
|
|
617
643
|
this.enabled = cfg.enabled !== false;
|
|
618
644
|
}
|
|
619
645
|
dispose() {
|
|
@@ -631,13 +657,13 @@ var MatchFilter = class {
|
|
|
631
657
|
if (this._allow && Object.keys(this._allow).length > 0) {
|
|
632
658
|
for (const [path, expected] of Object.entries(this._allow)) {
|
|
633
659
|
const actual = LogM8Utils.getPropertyByPath(logEvent, path);
|
|
634
|
-
if (!this.
|
|
660
|
+
if (!this._matches(actual, expected)) return false;
|
|
635
661
|
}
|
|
636
662
|
}
|
|
637
663
|
if (this._deny && Object.keys(this._deny).length > 0) {
|
|
638
664
|
for (const [path, expected] of Object.entries(this._deny)) {
|
|
639
665
|
const actual = LogM8Utils.getPropertyByPath(logEvent, path);
|
|
640
|
-
if (this.
|
|
666
|
+
if (this._matches(actual, expected)) return false;
|
|
641
667
|
}
|
|
642
668
|
}
|
|
643
669
|
return true;
|
|
@@ -645,6 +671,15 @@ var MatchFilter = class {
|
|
|
645
671
|
return false;
|
|
646
672
|
}
|
|
647
673
|
}
|
|
674
|
+
// Matches actual against expected, supporting RegExp; otherwise deep equality.
|
|
675
|
+
_matches(actual, expected) {
|
|
676
|
+
if (expected instanceof RegExp) {
|
|
677
|
+
if (actual === void 0 || actual === null) return false;
|
|
678
|
+
const asString = typeof actual === "string" ? actual : String(actual);
|
|
679
|
+
return expected.test(asString);
|
|
680
|
+
}
|
|
681
|
+
return this._isEqual(actual, expected);
|
|
682
|
+
}
|
|
648
683
|
// Simple deep equality for primitives, arrays, plain objects, dates
|
|
649
684
|
_isEqual(a, b) {
|
|
650
685
|
if (a === b) return true;
|
|
@@ -675,6 +710,20 @@ var MatchFilter = class {
|
|
|
675
710
|
_isPlainObject(val) {
|
|
676
711
|
return typeof val === "object" && val !== null && !Array.isArray(val) && Object.getPrototypeOf(val) === Object.prototype;
|
|
677
712
|
}
|
|
713
|
+
// Convert rule map values: regex-like strings -> RegExp; leave others as-is.
|
|
714
|
+
_prepareRules(map) {
|
|
715
|
+
if (!map || Object.keys(map).length === 0) return void 0;
|
|
716
|
+
const prepared = {};
|
|
717
|
+
for (const [path, val] of Object.entries(map)) {
|
|
718
|
+
if (typeof val === "string") {
|
|
719
|
+
const rx = LogM8Utils.parseRegexFromString(val);
|
|
720
|
+
prepared[path] = rx ?? val;
|
|
721
|
+
} else {
|
|
722
|
+
prepared[path] = val;
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
return prepared;
|
|
726
|
+
}
|
|
678
727
|
};
|
|
679
728
|
var MatchFilterFactory = class {
|
|
680
729
|
constructor() {
|
|
@@ -1000,16 +1049,27 @@ var DEFAULT_APPENDERS = [
|
|
|
1000
1049
|
];
|
|
1001
1050
|
var LogM8 = class {
|
|
1002
1051
|
constructor() {
|
|
1003
|
-
__publicField(this, "_initialized"
|
|
1004
|
-
__publicField(this, "_pluginManager"
|
|
1005
|
-
__publicField(this, "_loggers"
|
|
1006
|
-
__publicField(this, "_appenders"
|
|
1052
|
+
__publicField(this, "_initialized");
|
|
1053
|
+
__publicField(this, "_pluginManager");
|
|
1054
|
+
__publicField(this, "_loggers");
|
|
1055
|
+
__publicField(this, "_appenders");
|
|
1007
1056
|
__publicField(this, "_filters", []);
|
|
1008
|
-
__publicField(this, "
|
|
1009
|
-
__publicField(this, "
|
|
1010
|
-
__publicField(this, "
|
|
1057
|
+
__publicField(this, "_globalLogLevel");
|
|
1058
|
+
__publicField(this, "_globalLogLevelNumber");
|
|
1059
|
+
__publicField(this, "_logLevelValues");
|
|
1060
|
+
__publicField(this, "_logLevelSet");
|
|
1011
1061
|
// Buffer for log events before the system is initialized
|
|
1012
|
-
__publicField(this, "_logBuffer"
|
|
1062
|
+
__publicField(this, "_logBuffer");
|
|
1063
|
+
this._initialized = false;
|
|
1064
|
+
this._pluginManager = new PluginManager();
|
|
1065
|
+
this._loggers = /* @__PURE__ */ new Map();
|
|
1066
|
+
this._appenders = [];
|
|
1067
|
+
this._filters = [];
|
|
1068
|
+
this._logLevelValues = Object.values(LogLevel);
|
|
1069
|
+
this._logLevelSet = new Set(this._logLevelValues);
|
|
1070
|
+
this._globalLogLevel = LogLevel.info;
|
|
1071
|
+
this._globalLogLevelNumber = this._logLevelValues.indexOf(LogLevel.info);
|
|
1072
|
+
this._logBuffer = [];
|
|
1013
1073
|
this._pluginManager.registerPluginFactory(new ConsoleAppenderFactory());
|
|
1014
1074
|
this._pluginManager.registerPluginFactory(new FileAppenderFactory());
|
|
1015
1075
|
this._pluginManager.registerPluginFactory(new DefaultFormatterFactory());
|
|
@@ -1046,10 +1106,10 @@ var LogM8 = class {
|
|
|
1046
1106
|
init(config) {
|
|
1047
1107
|
config = Object.assign({}, config);
|
|
1048
1108
|
this._reset();
|
|
1049
|
-
this.
|
|
1109
|
+
this._globalLogLevel = this._logLevelSet.has(config.level) ? config.level : LogLevel.info;
|
|
1050
1110
|
for (const [name, level] of Object.entries(config.loggers ?? {})) {
|
|
1051
1111
|
const logger = this.getLogger(name);
|
|
1052
|
-
const l = this._logLevelSet.has(level) ? level : this.
|
|
1112
|
+
const l = this._logLevelSet.has(level) ? level : this._globalLogLevel;
|
|
1053
1113
|
logger.setLevel(l);
|
|
1054
1114
|
}
|
|
1055
1115
|
const appenderConfigs = config.appenders ?? DEFAULT_APPENDERS;
|
|
@@ -1146,7 +1206,7 @@ var LogM8 = class {
|
|
|
1146
1206
|
if (existingLogger) return existingLogger;
|
|
1147
1207
|
const logger = {
|
|
1148
1208
|
name: nameStr,
|
|
1149
|
-
level: this.
|
|
1209
|
+
level: this._globalLogLevel,
|
|
1150
1210
|
context: {}
|
|
1151
1211
|
};
|
|
1152
1212
|
logger.fatal = this._log.bind(this, logger, LogLevel.fatal);
|
|
@@ -1159,10 +1219,24 @@ var LogM8 = class {
|
|
|
1159
1219
|
logger.setLevel = this._setLevel.bind(this, logger);
|
|
1160
1220
|
logger.setContext = this._setContext.bind(this, logger);
|
|
1161
1221
|
logger.getLogger = (name2) => this.getLogger([logger.name, name2]);
|
|
1162
|
-
this._setLevel(logger, this.
|
|
1222
|
+
this._setLevel(logger, this._globalLogLevel);
|
|
1163
1223
|
this._loggers.set(logger.name, logger);
|
|
1164
1224
|
return logger;
|
|
1165
1225
|
}
|
|
1226
|
+
/**
|
|
1227
|
+
* Sets the global logging level or a specific logger's level.
|
|
1228
|
+
*
|
|
1229
|
+
* @param level - New logging level name (e.g., 'info', 'debug', 'off')
|
|
1230
|
+
* @param logger - Optional logger name to set level for a specific logger
|
|
1231
|
+
*/
|
|
1232
|
+
setLevel(level, logger) {
|
|
1233
|
+
if (logger) {
|
|
1234
|
+
this.getLogger(logger).setLevel(level);
|
|
1235
|
+
} else {
|
|
1236
|
+
this._globalLogLevel = this._logLevelSet.has(level) ? level : this._globalLogLevel;
|
|
1237
|
+
this._globalLogLevelNumber = this._logLevelValues.indexOf(this._globalLogLevel);
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1166
1240
|
/**
|
|
1167
1241
|
* Enables an appender to resume processing log events.
|
|
1168
1242
|
*
|
|
@@ -1293,7 +1367,7 @@ var LogM8 = class {
|
|
|
1293
1367
|
}
|
|
1294
1368
|
_log(logger, level, message, ...data) {
|
|
1295
1369
|
const levelNumber = this._logLevelValues.indexOf(level);
|
|
1296
|
-
if (levelNumber > logger._levelNumber) return;
|
|
1370
|
+
if (levelNumber > logger._levelNumber || levelNumber > this._globalLogLevelNumber) return;
|
|
1297
1371
|
const logEvent = {
|
|
1298
1372
|
logger: logger.name,
|
|
1299
1373
|
level,
|
|
@@ -1318,9 +1392,9 @@ var LogM8 = class {
|
|
|
1318
1392
|
}
|
|
1319
1393
|
}
|
|
1320
1394
|
_setLevel(logger, level) {
|
|
1321
|
-
logger.level = level;
|
|
1395
|
+
logger.level = this._logLevelSet.has(level) ? level : logger.level;
|
|
1322
1396
|
logger._levelNumber = this._logLevelValues.indexOf(level);
|
|
1323
|
-
logger.isEnabled = level !== LogLevel.off;
|
|
1397
|
+
logger.isEnabled = logger.level !== LogLevel.off;
|
|
1324
1398
|
const levelNumber = logger._levelNumber;
|
|
1325
1399
|
logger.isFatal = this._logLevelValues.indexOf(LogLevel.fatal) <= levelNumber;
|
|
1326
1400
|
logger.isError = this._logLevelValues.indexOf(LogLevel.error) <= levelNumber;
|
|
@@ -1368,17 +1442,17 @@ var LogM8 = class {
|
|
|
1368
1442
|
this.flushAppenders();
|
|
1369
1443
|
this._appenders = [];
|
|
1370
1444
|
this._loggers.clear();
|
|
1371
|
-
this.
|
|
1445
|
+
this._globalLogLevel = LogLevel.info;
|
|
1372
1446
|
this._pluginManager.disposePlugins();
|
|
1373
1447
|
}
|
|
1374
1448
|
};
|
|
1375
1449
|
|
|
1376
1450
|
// src/index.ts
|
|
1377
|
-
var
|
|
1451
|
+
var LogM82 = new LogM8();
|
|
1378
1452
|
export {
|
|
1379
1453
|
LogLevel,
|
|
1454
|
+
LogM82 as LogM8,
|
|
1380
1455
|
LogM8Utils,
|
|
1381
|
-
Logging,
|
|
1382
1456
|
PluginKind
|
|
1383
1457
|
};
|
|
1384
1458
|
//# sourceMappingURL=index.js.map
|