@@ -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