Skip to content

Commit ee46f9f

Browse files
committed
fix: using WeakRef to bring back looking up child loggers with the same key, but allow garbage collection of child loggers
1 parent a138aca commit ee46f9f

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/Logger.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ class Logger {
1212
public readonly handlers: Set<Handler>;
1313
public readonly parent?: Logger;
1414

15+
protected _loggers: Map<string, WeakRef<Logger>> = new Map();
16+
protected loggersRegistry: FinalizationRegistry<string>;
17+
1518
constructor(
1619
key: string = 'root',
1720
level: LogLevel = LogLevel.NOTSET,
@@ -23,10 +26,35 @@ class Logger {
2326
this.handlers = new Set(handlers);
2427
this.parent = parent;
2528
this.keys = parent != null ? `${parent.keys}.${key}` : key;
29+
this.loggersRegistry = new FinalizationRegistry((key: string) => {
30+
this._loggers.delete(key);
31+
});
32+
}
33+
34+
public get loggers(): Map<string, Logger> {
35+
return new Map(
36+
[...this._loggers.entries()]
37+
.map(([key, loggerRef]) => {
38+
const logger = loggerRef.deref();
39+
if (logger != null) {
40+
return [key, logger];
41+
} else {
42+
return undefined;
43+
}
44+
})
45+
.filter((e) => e != null) as Array<[string, Logger]>,
46+
);
2647
}
2748

2849
public getChild(key: string): Logger {
29-
return new Logger(key, LogLevel.NOTSET, [], this);
50+
let loggerRef = this._loggers.get(key);
51+
let logger = loggerRef?.deref();
52+
if (logger != null) return logger;
53+
logger = new Logger(key, LogLevel.NOTSET, [], this);
54+
loggerRef = new WeakRef(logger);
55+
this._loggers.set(key, loggerRef);
56+
this.loggersRegistry.register(logger, key);
57+
return logger;
3058
}
3159

3260
public getParent(): Logger | undefined {

0 commit comments

Comments
 (0)