diff --git a/package-lock.json b/package-lock.json index 487c841..1d7719d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@matrixai/logger", - "version": "3.1.0", + "version": "3.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@matrixai/logger", - "version": "3.1.0", + "version": "3.1.3", "license": "Apache-2.0", "devDependencies": { "@swc/core": "^1.3.62", diff --git a/package.json b/package.json index fcdd695..e457460 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@matrixai/logger", - "version": "3.1.0", + "version": "3.1.3", "author": "Roger Qiu", "description": "Python-like JavaScript Logger", "license": "Apache-2.0", diff --git a/src/Logger.ts b/src/Logger.ts index 14a209f..0566771 100644 --- a/src/Logger.ts +++ b/src/Logger.ts @@ -11,7 +11,9 @@ class Logger { public readonly keys: string; public readonly handlers: Set; public readonly parent?: Logger; - public readonly loggers: { [key: string]: Logger } = {}; + + protected _loggers: Map> = new Map(); + protected loggersRegistry: FinalizationRegistry; constructor( key: string = 'root', @@ -24,14 +26,34 @@ class Logger { this.handlers = new Set(handlers); this.parent = parent; this.keys = parent != null ? `${parent.keys}.${key}` : key; + this.loggersRegistry = new FinalizationRegistry((key: string) => { + this._loggers.delete(key); + }); + } + + public get loggers(): Map { + return new Map( + [...this._loggers.entries()] + .map(([key, loggerRef]) => { + const logger = loggerRef.deref(); + if (logger != null) { + return [key, logger]; + } else { + return undefined; + } + }) + .filter((e) => e != null) as Array<[string, Logger]>, + ); } public getChild(key: string): Logger { - if (this.loggers[key]) { - return this.loggers[key]; - } - const logger = new Logger(key, LogLevel.NOTSET, [], this); - this.loggers[key] = logger; + let loggerRef = this._loggers.get(key); + let logger = loggerRef?.deref(); + if (logger != null) return logger; + logger = new Logger(key, LogLevel.NOTSET, [], this); + loggerRef = new WeakRef(logger); + this._loggers.set(key, loggerRef); + this.loggersRegistry.register(logger, key); return logger; }