1- import type { ToString , LogRecord , LogFormatter } from './types' ;
1+ import type { LogData , LogRecord , LogFormatter } from './types' ;
22import type Handler from './Handler' ;
3-
43import { LogLevel } from './types' ;
54import ConsoleErrHandler from './handlers/ConsoleErrHandler' ;
5+ import * as utils from './utils' ;
66
77class Logger {
88 public key : string ;
@@ -75,48 +75,131 @@ class Logger {
7575 }
7676 }
7777
78- public setFilter ( filter : RegExp ) {
78+ public setFilter ( filter : RegExp ) : void {
7979 this . filter = filter ;
8080 }
8181
82- public debug ( data : ToString , format ?: LogFormatter ) : void {
83- this . log ( data . toString ( ) , LogLevel . DEBUG , format ) ;
82+ public unsetFilter ( ) : void {
83+ delete this . filter ;
8484 }
8585
86- public info ( data : ToString , format ?: LogFormatter ) : void {
87- this . log ( data . toString ( ) , LogLevel . INFO , format ) ;
86+ public debug ( msg : string , format ?: LogFormatter ) : void ;
87+ public debug ( msg : string , data : LogData , format ?: LogFormatter ) : void ;
88+ public debug (
89+ msg : string ,
90+ formatOrData ?: LogFormatter | LogData ,
91+ format ?: LogFormatter ,
92+ ) : void {
93+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
94+ return this . log ( msg , { } , LogLevel . DEBUG , formatOrData as LogFormatter ) ;
95+ } else {
96+ return this . log ( msg , formatOrData , LogLevel . DEBUG , format ) ;
97+ }
8898 }
8999
90- public warn ( data : ToString , format ?: LogFormatter ) : void {
91- this . log ( data . toString ( ) , LogLevel . WARN , format ) ;
100+ public info ( msg : string , format ?: LogFormatter ) : void ;
101+ public info ( msg : string , data : LogData , format ?: LogFormatter ) : void ;
102+ public info (
103+ msg : string ,
104+ formatOrData ?: LogFormatter | LogData ,
105+ format ?: LogFormatter ,
106+ ) : void {
107+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
108+ return this . log ( msg , { } , LogLevel . INFO , formatOrData as LogFormatter ) ;
109+ } else {
110+ return this . log ( msg , formatOrData , LogLevel . INFO , format ) ;
111+ }
92112 }
93113
94- public error ( data : ToString , format ?: LogFormatter ) : void {
95- this . log ( data . toString ( ) , LogLevel . ERROR , format ) ;
114+ public warn ( msg : string , format ?: LogFormatter ) : void ;
115+ public warn ( msg : string , data : LogData , format ?: LogFormatter ) : void ;
116+ public warn (
117+ msg : string ,
118+ formatOrData ?: LogFormatter | LogData ,
119+ format ?: LogFormatter ,
120+ ) : void {
121+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
122+ return this . log ( msg , { } , LogLevel . WARN , formatOrData as LogFormatter ) ;
123+ } else {
124+ return this . log ( msg , formatOrData , LogLevel . WARN , format ) ;
125+ }
96126 }
97127
98- protected log ( msg : string , level : LogLevel , format ?: LogFormatter ) : void {
99- const record = this . makeRecord ( msg , level ) ;
100- if ( level >= this . getEffectiveLevel ( ) ) {
101- this . callHandlers ( record , format ) ;
128+ public error ( msg : string , format ?: LogFormatter ) : void ;
129+ public error ( msg : string , data : LogData , format ?: LogFormatter ) : void ;
130+ public error (
131+ msg : string ,
132+ formatOrData ?: LogFormatter | LogData ,
133+ format ?: LogFormatter ,
134+ ) : void {
135+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
136+ return this . log ( msg , { } , LogLevel . ERROR , formatOrData as LogFormatter ) ;
137+ } else {
138+ return this . log ( msg , formatOrData , LogLevel . ERROR , format ) ;
102139 }
103140 }
104141
105- protected makeRecord ( msg : string , level : LogLevel ) : LogRecord {
142+ protected log (
143+ msg : string ,
144+ data : LogData ,
145+ level : LogLevel ,
146+ format ?: LogFormatter ,
147+ ) : void {
148+ const record = this . makeRecord ( msg , data , level ) ;
149+ this . callHandlers ( record , level , format ) ;
150+ }
151+
152+ /**
153+ * Constructs a `LogRecord`
154+ * The `LogRecord` can contain lazy values via wrapping with a lambda
155+ * This improves performance as they are not evaluated unless needed during formatting
156+ */
157+ protected makeRecord ( msg : string , data : LogData , level : LogLevel ) : LogRecord {
106158 return {
159+ logger : this ,
107160 key : this . key ,
108161 date : new Date ( ) ,
109- msg : msg ,
110- level : level ,
111- logger : this ,
162+ level,
163+ msg,
164+ data,
165+ keys : ( ) => {
166+ let logger : Logger = this ;
167+ let keys = this . key ;
168+ while ( logger . parent != null ) {
169+ logger = logger . parent ;
170+ keys = `${ logger . key } .${ keys } ` ;
171+ }
172+ return keys ;
173+ } ,
174+ stack : ( ) => {
175+ let stack : string ;
176+ if ( utils . hasCaptureStackTrace && utils . hasStackTraceLimit ) {
177+ Error . stackTraceLimit ++ ;
178+ const error = { } as { stack : string } ;
179+ // @ts -ignore: protected `Logger.prototype.log`
180+ Error . captureStackTrace ( error , Logger . prototype . log ) ;
181+ Error . stackTraceLimit -- ;
182+ stack = error . stack ;
183+ // Remove the stack title and the first stack line for `Logger.prototype.log`
184+ stack = stack . slice ( stack . indexOf ( '\n' , stack . indexOf ( '\n' ) + 1 ) + 1 ) ;
185+ } else {
186+ stack = new Error ( ) . stack ?? '' ;
187+ stack = stack . slice ( stack . indexOf ( '\n' ) + 1 ) ;
188+ }
189+ return stack ;
190+ } ,
112191 } ;
113192 }
114193
115194 protected callHandlers (
116195 record : LogRecord ,
196+ level : LogLevel ,
117197 format ?: LogFormatter ,
118198 keys : Array < string > = [ ] ,
119199 ) : void {
200+ if ( level < this . getEffectiveLevel ( ) ) {
201+ return ;
202+ }
120203 keys . push ( this . key ) ;
121204 if ( this . filter != null ) {
122205 const keysPath = keys . reduce ( ( prev , curr ) => `${ curr } .${ prev } ` ) ;
@@ -126,7 +209,7 @@ class Logger {
126209 handler . handle ( record , format ) ;
127210 }
128211 if ( this . parent ) {
129- this . parent . callHandlers ( record , format , keys ) ;
212+ this . parent . callHandlers ( record , level , format , keys ) ;
130213 }
131214 }
132215}
0 commit comments