@@ -18,12 +18,20 @@ export interface AckeeLogger extends PinoLogger {
1818 express : AckeeLoggerExpressMiddleware ;
1919 expressError : ErrorRequestHandler ;
2020 stream : Writable ;
21+ ( childName : string ) : any ;
2122}
2223
2324export interface AckeeLoggerFactory extends AckeeLogger {
24- ( data : string | AckeeLoggerOptions ) : AckeeLogger ;
25+ ( data ? : string | AckeeLoggerOptions ) : AckeeLogger ;
2526}
2627
28+ const makeCallable = < T extends object , F extends ( ...args : any [ ] ) => any > ( obj : T , fun : F ) : T & F =>
29+ new Proxy ( fun as any , {
30+ get : ( _target , key ) => ( obj as any ) [ key ] ,
31+ } ) ;
32+
33+ const objEmpty = ( obj : object ) => Object . keys ( obj ) . length === 0 ;
34+
2735// This is a custom slightly edited version of pino-multistream's write method, which adds support for maximum log level
2836// The original version was pino-multistream 4.2.0 (commit bf7941f) - https://github.com/pinojs/pino-multi-stream/blob/bf7941f77661b6c14dd40840ff4a4db6897f08eb/multistream.js#L43
2937const maxLevelWrite : pino . WriteFn = function ( this : any , data : object ) : void {
@@ -95,9 +103,6 @@ const defaultLogger = (options: AckeeLoggerOptions & { loggerName?: string } = {
95103 } ) ;
96104} ;
97105
98- let rootLogger : AckeeLogger ;
99- let rootOptions : AckeeLoggerOptions ;
100-
101106const parseLoggerData = ( data : string | AckeeLoggerOptions = { } ) => {
102107 let loggerName : string | undefined ;
103108 let options : AckeeLoggerOptions = { } ;
@@ -113,21 +118,21 @@ const parseLoggerData = (data: string | AckeeLoggerOptions = {}) => {
113118 return { loggerName, options } ;
114119} ;
115120
116- const loggerFactory = ( data : string | AckeeLoggerOptions = { } ) : AckeeLogger => {
121+ const loggerFactory = ( data : string | AckeeLoggerOptions = { } , loggerOptions : AckeeLoggerOptions = { } ) : AckeeLogger => {
122+ // console.log('Factory called');
117123 const { loggerName, options } = parseLoggerData ( data ) ;
124+ loggerOptions = objEmpty ( options ) ? loggerOptions : options ;
125+ const logger = defaultLogger ( Object . assign ( { loggerName } , loggerOptions ) ) ;
118126
119- if ( ! rootLogger ) {
120- rootLogger = defaultLogger ( options ) ;
121- rootOptions = options ;
122- }
123- if ( ! loggerName ) {
124- return rootLogger ;
125- }
126- return defaultLogger ( Object . assign ( { loggerName } , rootOptions ) ) ;
127+ const loggerProxy = makeCallable ( logger , ( childName : string ) => {
128+ const childLoggerName = [ loggerName , childName ] . join ( '' ) ;
129+ // console.log('Creating child', childName);
130+ const childOptions = loggerOptions ;
131+ return loggerFactory ( childLoggerName , childOptions ) ;
132+ } ) ;
133+ return loggerProxy ;
127134} ;
128135
129- const factoryProxy = new Proxy ( loggerFactory , {
130- get : ( target , key ) => ( target ( ) as any ) [ key ] ,
131- } ) as AckeeLoggerFactory ;
136+ const factoryProxy = makeCallable ( loggerFactory ( ) , loggerFactory ) ;
132137
133138export default factoryProxy ;
0 commit comments