@ncoderz/log-m8 1.2.4 → 1.3.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/dist/index.js CHANGED
@@ -1078,6 +1078,7 @@ var LogM8 = class {
1078
1078
  __publicField(this, "_globalLogLevelNumber");
1079
1079
  __publicField(this, "_logLevelValues");
1080
1080
  __publicField(this, "_logLevelSet");
1081
+ __publicField(this, "_logLevelIndexMap");
1081
1082
  // Buffer for log events before the system is initialized
1082
1083
  __publicField(this, "_logBuffer");
1083
1084
  this._initialized = false;
@@ -1087,8 +1088,11 @@ var LogM8 = class {
1087
1088
  this._filters = [];
1088
1089
  this._logLevelValues = Object.values(LogLevel);
1089
1090
  this._logLevelSet = new Set(this._logLevelValues);
1091
+ this._logLevelIndexMap = new Map(
1092
+ this._logLevelValues.map((level, index) => [level, index])
1093
+ );
1090
1094
  this._globalLogLevel = LogLevel.info;
1091
- this._globalLogLevelNumber = this._logLevelValues.indexOf(LogLevel.info);
1095
+ this._globalLogLevelNumber = this._logLevelIndexMap.get(LogLevel.info);
1092
1096
  this._logBuffer = [];
1093
1097
  this._pluginManager.registerPluginFactory(new ConsoleAppenderFactory());
1094
1098
  this._pluginManager.registerPluginFactory(new FileAppenderFactory());
@@ -1135,32 +1139,7 @@ var LogM8 = class {
1135
1139
  }
1136
1140
  const appenderConfigs = config.appenders ?? DEFAULT_APPENDERS;
1137
1141
  for (const appenderConfigOrName of appenderConfigs) {
1138
- const appender = this._pluginManager.createPlugin(
1139
- PluginKind.appender,
1140
- appenderConfigOrName
1141
- );
1142
- const appenderConfig = LogM8Utils.isString(appenderConfigOrName) ? {
1143
- name: appender.name
1144
- } : appenderConfigOrName;
1145
- const formatter = appenderConfig?.formatter ? this._pluginManager.createPlugin(
1146
- PluginKind.formatter,
1147
- appenderConfig.formatter
1148
- ) : void 0;
1149
- const filters = [];
1150
- const ac = appenderConfig;
1151
- for (const filterConfig of ac.filters ?? []) {
1152
- const filter = this._pluginManager.createPlugin(PluginKind.filter, filterConfig);
1153
- if (filter) {
1154
- filters.push(filter);
1155
- } else {
1156
- if (console && console.log) {
1157
- console.log(
1158
- `LogM8: Filter '${filterConfig}' not found for appender ${appenderConfig.name}.`
1159
- );
1160
- }
1161
- }
1162
- }
1163
- appender.init(appenderConfig, formatter, filters);
1142
+ const appender = this._createAndInitAppender(appenderConfigOrName);
1164
1143
  this._appenders.push(appender);
1165
1144
  }
1166
1145
  this._sortAppenders();
@@ -1267,7 +1246,7 @@ var LogM8 = class {
1267
1246
  this.getLogger(logger).setLevel(levelStr);
1268
1247
  } else {
1269
1248
  this._globalLogLevel = this._logLevelSet.has(levelStr) ? levelStr : this._globalLogLevel;
1270
- this._globalLogLevelNumber = this._logLevelValues.indexOf(this._globalLogLevel);
1249
+ this._globalLogLevelNumber = this._logLevelIndexMap.get(this._globalLogLevel);
1271
1250
  }
1272
1251
  }
1273
1252
  /**
@@ -1290,6 +1269,101 @@ var LogM8 = class {
1290
1269
  if (!appender) return;
1291
1270
  appender.enabled = false;
1292
1271
  }
1272
+ /**
1273
+ * Adds an appender to the logging system at runtime.
1274
+ *
1275
+ * Creates and initializes the appender using the plugin factory system,
1276
+ * including any configured formatter and filters. The appender is inserted
1277
+ * into the priority-sorted appender list and immediately begins receiving
1278
+ * log events.
1279
+ *
1280
+ * Must be called after init(). The appender name must not already be in use.
1281
+ *
1282
+ * @param config - Appender name (string) or full configuration object
1283
+ *
1284
+ * @throws {Error} When called before init()
1285
+ * @throws {Error} When an appender with the same name already exists
1286
+ * @throws {Error} When the referenced plugin factory is not registered
1287
+ *
1288
+ * @example
1289
+ * ```typescript
1290
+ * // Add by name (uses factory defaults)
1291
+ * Logging.addAppender('console');
1292
+ *
1293
+ * // Add with full configuration
1294
+ * Logging.addAppender({
1295
+ * name: 'file',
1296
+ * filename: 'debug.log',
1297
+ * formatter: 'json-formatter',
1298
+ * filters: ['sensitive-data'],
1299
+ * priority: 10
1300
+ * });
1301
+ * ```
1302
+ */
1303
+ addAppender(config) {
1304
+ if (!this._initialized) {
1305
+ throw new Error("LogM8: Cannot add appender before init()");
1306
+ }
1307
+ const name = typeof config === "string" ? config : config.name;
1308
+ if (this._getAppender(name)) {
1309
+ throw new Error(`LogM8: Appender '${name}' already exists`);
1310
+ }
1311
+ const appender = this._createAndInitAppender(config);
1312
+ this._appenders.push(appender);
1313
+ this._sortAppenders();
1314
+ }
1315
+ /**
1316
+ * Removes an appender from the logging system at runtime.
1317
+ *
1318
+ * Flushes any buffered output, disposes the appender, and removes it
1319
+ * from the active appender list. The appender will no longer receive
1320
+ * log events after removal.
1321
+ *
1322
+ * @param name - Name of the appender to remove
1323
+ * @returns True if the appender was found and removed, false otherwise
1324
+ *
1325
+ * @example
1326
+ * ```typescript
1327
+ * // Remove a dynamically added appender
1328
+ * Logging.removeAppender('file');
1329
+ *
1330
+ * // Check if removal succeeded
1331
+ * if (!Logging.removeAppender('unknown')) {
1332
+ * console.warn('Appender not found');
1333
+ * }
1334
+ * ```
1335
+ */
1336
+ removeAppender(name) {
1337
+ const appender = this._getAppender(name);
1338
+ if (!appender) return false;
1339
+ try {
1340
+ appender.flush();
1341
+ } catch (err) {
1342
+ if (console && console.error) {
1343
+ console.error(`LogM8: Failed to flush appender during removal: ${appender.name}:`, err);
1344
+ }
1345
+ }
1346
+ appender.dispose();
1347
+ this._appenders = this._appenders.filter((a) => a !== appender);
1348
+ return true;
1349
+ }
1350
+ /**
1351
+ * Returns the names of all currently registered appenders.
1352
+ *
1353
+ * The returned array is a snapshot; modifications to it do not affect
1354
+ * the logging system. Names are in priority-sorted order (highest first).
1355
+ *
1356
+ * @returns Array of appender names
1357
+ *
1358
+ * @example
1359
+ * ```typescript
1360
+ * const names = Logging.getAppenderNames();
1361
+ * console.log('Active appenders:', names); // ['console', 'file']
1362
+ * ```
1363
+ */
1364
+ getAppenderNames() {
1365
+ return this._appenders.map((a) => a.name);
1366
+ }
1293
1367
  /**
1294
1368
  * Forces an appender to flush any buffered output.
1295
1369
  *
@@ -1398,9 +1472,10 @@ var LogM8 = class {
1398
1472
  registerPluginFactory(pluginFactory) {
1399
1473
  this._pluginManager.registerPluginFactory(pluginFactory);
1400
1474
  }
1401
- _log(logger, level, message, ...data) {
1402
- const levelNumber = this._logLevelValues.indexOf(level);
1475
+ _log(logger, level, message) {
1476
+ const levelNumber = this._logLevelIndexMap.get(level);
1403
1477
  if (levelNumber > logger._levelNumber || levelNumber > this._globalLogLevelNumber) return;
1478
+ const data = arguments.length > 3 ? Array.prototype.slice.call(arguments, 3) : [];
1404
1479
  const logEvent = {
1405
1480
  logger: logger.name,
1406
1481
  level,
@@ -1427,16 +1502,16 @@ var LogM8 = class {
1427
1502
  _setLevel(logger, level) {
1428
1503
  const levelStr = (level ?? "").trim().toLowerCase();
1429
1504
  logger.level = this._logLevelSet.has(levelStr) ? levelStr : logger.level;
1430
- logger._levelNumber = this._logLevelValues.indexOf(logger.level);
1505
+ logger._levelNumber = this._logLevelIndexMap.get(logger.level);
1431
1506
  logger.isEnabled = logger.level !== LogLevel.off;
1432
1507
  const levelNumber = logger._levelNumber;
1433
- logger.isFatal = this._logLevelValues.indexOf(LogLevel.fatal) <= levelNumber;
1434
- logger.isError = this._logLevelValues.indexOf(LogLevel.error) <= levelNumber;
1435
- logger.isWarn = this._logLevelValues.indexOf(LogLevel.warn) <= levelNumber;
1436
- logger.isInfo = this._logLevelValues.indexOf(LogLevel.info) <= levelNumber;
1437
- logger.isDebug = this._logLevelValues.indexOf(LogLevel.debug) <= levelNumber;
1438
- logger.isTrack = this._logLevelValues.indexOf(LogLevel.track) <= levelNumber;
1439
- logger.isTrace = this._logLevelValues.indexOf(LogLevel.trace) <= levelNumber;
1508
+ logger.isFatal = this._logLevelIndexMap.get(LogLevel.fatal) <= levelNumber;
1509
+ logger.isError = this._logLevelIndexMap.get(LogLevel.error) <= levelNumber;
1510
+ logger.isWarn = this._logLevelIndexMap.get(LogLevel.warn) <= levelNumber;
1511
+ logger.isInfo = this._logLevelIndexMap.get(LogLevel.info) <= levelNumber;
1512
+ logger.isDebug = this._logLevelIndexMap.get(LogLevel.debug) <= levelNumber;
1513
+ logger.isTrack = this._logLevelIndexMap.get(LogLevel.track) <= levelNumber;
1514
+ logger.isTrace = this._logLevelIndexMap.get(LogLevel.trace) <= levelNumber;
1440
1515
  }
1441
1516
  _setContext(logger, context) {
1442
1517
  logger.context = context ?? {};
@@ -1459,11 +1534,40 @@ var LogM8 = class {
1459
1534
  }
1460
1535
  }
1461
1536
  }
1537
+ _createAndInitAppender(appenderConfigOrName) {
1538
+ const appender = this._pluginManager.createPlugin(
1539
+ PluginKind.appender,
1540
+ appenderConfigOrName
1541
+ );
1542
+ const appenderConfig = LogM8Utils.isString(appenderConfigOrName) ? {
1543
+ name: appender.name
1544
+ } : appenderConfigOrName;
1545
+ const formatter = appenderConfig?.formatter ? this._pluginManager.createPlugin(
1546
+ PluginKind.formatter,
1547
+ appenderConfig.formatter
1548
+ ) : void 0;
1549
+ const filters = [];
1550
+ const ac = appenderConfig;
1551
+ for (const filterConfig of ac.filters ?? []) {
1552
+ const filter = this._pluginManager.createPlugin(PluginKind.filter, filterConfig);
1553
+ if (filter) {
1554
+ filters.push(filter);
1555
+ } else {
1556
+ if (console && console.log) {
1557
+ console.log(
1558
+ `LogM8: Filter '${filterConfig}' not found for appender ${appenderConfig.name}.`
1559
+ );
1560
+ }
1561
+ }
1562
+ }
1563
+ appender.init(appenderConfig, formatter, filters);
1564
+ return appender;
1565
+ }
1462
1566
  _getAppender(name) {
1463
1567
  return this._appenders.find((a) => a.name === name);
1464
1568
  }
1465
1569
  _sortAppenders() {
1466
- this._appenders.sort((a, b) => {
1570
+ this._appenders = [...this._appenders].sort((a, b) => {
1467
1571
  const aPriority = a?.priority ?? 0;
1468
1572
  const bPriority = b?.priority ?? 0;
1469
1573
  return bPriority - aPriority;
@@ -1481,6 +1585,15 @@ var LogM8 = class {
1481
1585
  }
1482
1586
  };
1483
1587
 
1588
+ // src/_generated/package_info.ts
1589
+ var PACKAGE_INFO = {
1590
+ "name": "@ncoderz/log-m8",
1591
+ "version": "1.3.0",
1592
+ "author": "RA Sewell <richard.sewell@ncoderz.com>",
1593
+ "license": "BSD-2-Clause",
1594
+ "description": "Logging system for TypeScript / JavaScript"
1595
+ };
1596
+
1484
1597
  // src/NullLogger.ts
1485
1598
  var NullLogger = class {
1486
1599
  constructor() {
@@ -1523,10 +1636,16 @@ var NullLogger = class {
1523
1636
  // src/index.ts
1524
1637
  var LogM82 = new LogM8();
1525
1638
  export {
1639
+ ConsoleAppender,
1640
+ DefaultFormatter,
1641
+ FileAppender,
1642
+ JsonFormatter,
1526
1643
  LogLevel,
1527
1644
  LogM82 as LogM8,
1528
1645
  LogM8Utils,
1646
+ MatchFilter,
1529
1647
  NullLogger,
1648
+ PACKAGE_INFO,
1530
1649
  PluginKind
1531
1650
  };
1532
1651
  //# sourceMappingURL=index.js.map