1- import type { ToString , LogRecord , LogFormatter } from './types' ;
1+ import type { ToString , 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,153 @@ 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 : ToString | undefined , format ?: LogFormatter ) : void ;
87+ public debug (
88+ msg : ToString | undefined ,
89+ data : LogData ,
90+ format ?: LogFormatter ,
91+ ) : void ;
92+ public debug (
93+ msg : ToString | undefined ,
94+ formatOrData ?: LogFormatter | LogData ,
95+ format ?: LogFormatter ,
96+ ) : void {
97+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
98+ return this . log ( msg , { } , LogLevel . DEBUG , formatOrData as LogFormatter ) ;
99+ } else {
100+ return this . log ( msg , formatOrData , LogLevel . DEBUG , format ) ;
101+ }
88102 }
89103
90- public warn ( data : ToString , format ?: LogFormatter ) : void {
91- this . log ( data . toString ( ) , LogLevel . WARN , format ) ;
104+ public info ( msg : ToString | undefined , format ?: LogFormatter ) : void ;
105+ public info (
106+ msg : ToString | undefined ,
107+ data : LogData ,
108+ format ?: LogFormatter ,
109+ ) : void ;
110+ public info (
111+ msg : ToString | undefined ,
112+ formatOrData ?: LogFormatter | LogData ,
113+ format ?: LogFormatter ,
114+ ) : void {
115+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
116+ return this . log ( msg , { } , LogLevel . INFO , formatOrData as LogFormatter ) ;
117+ } else {
118+ return this . log ( msg , formatOrData , LogLevel . INFO , format ) ;
119+ }
92120 }
93121
94- public error ( data : ToString , format ?: LogFormatter ) : void {
95- this . log ( data . toString ( ) , LogLevel . ERROR , format ) ;
122+ public warn ( msg : ToString | undefined , format ?: LogFormatter ) : void ;
123+ public warn (
124+ msg : ToString | undefined ,
125+ data : LogData ,
126+ format ?: LogFormatter ,
127+ ) : void ;
128+ public warn (
129+ msg : ToString | undefined ,
130+ formatOrData ?: LogFormatter | LogData ,
131+ format ?: LogFormatter ,
132+ ) : void {
133+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
134+ return this . log ( msg , { } , LogLevel . WARN , formatOrData as LogFormatter ) ;
135+ } else {
136+ return this . log ( msg , formatOrData , LogLevel . WARN , format ) ;
137+ }
96138 }
97139
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 ) ;
140+ public error ( msg : ToString | undefined , format ?: LogFormatter ) : void ;
141+ public error (
142+ msg : ToString | undefined ,
143+ data : LogData ,
144+ format ?: LogFormatter ,
145+ ) : void ;
146+ public error (
147+ msg : ToString | undefined ,
148+ formatOrData ?: LogFormatter | LogData ,
149+ format ?: LogFormatter ,
150+ ) : void {
151+ if ( formatOrData == null || typeof formatOrData === 'function' ) {
152+ return this . log ( msg , { } , LogLevel . ERROR , formatOrData as LogFormatter ) ;
153+ } else {
154+ return this . log ( msg , formatOrData , LogLevel . ERROR , format ) ;
102155 }
103156 }
104157
105- protected makeRecord ( msg : string , level : LogLevel ) : LogRecord {
158+ protected log (
159+ msg : ToString | undefined ,
160+ data : LogData ,
161+ level : LogLevel ,
162+ format ?: LogFormatter ,
163+ ) : void {
164+ // Filter on level before making a record
165+ if ( level < this . getEffectiveLevel ( ) ) return ;
166+ const record = this . makeRecord ( msg , data , level ) ;
167+ this . callHandlers ( record , level , format ) ;
168+ }
169+
170+ /**
171+ * Constructs a `LogRecord`
172+ * The `LogRecord` can contain lazy values via wrapping with a lambda
173+ * This improves performance as they are not evaluated unless needed during formatting
174+ */
175+ protected makeRecord (
176+ msg : ToString | undefined ,
177+ data : LogData ,
178+ level : LogLevel ,
179+ ) : LogRecord {
106180 return {
181+ logger : this ,
107182 key : this . key ,
108183 date : new Date ( ) ,
109- msg : msg ,
110- level : level ,
111- logger : this ,
184+ level,
185+ msg : msg ?. toString ( ) ,
186+ data,
187+ keys : ( ) => {
188+ let logger : Logger = this ;
189+ let keys = this . key ;
190+ while ( logger . parent != null ) {
191+ logger = logger . parent ;
192+ keys = `${ logger . key } .${ keys } ` ;
193+ }
194+ return keys ;
195+ } ,
196+ stack : ( ) => {
197+ let stack : string ;
198+ if ( utils . hasCaptureStackTrace && utils . hasStackTraceLimit ) {
199+ Error . stackTraceLimit ++ ;
200+ const error = { } as { stack : string } ;
201+ // @ts -ignore: protected `Logger.prototype.log`
202+ Error . captureStackTrace ( error , Logger . prototype . log ) ;
203+ Error . stackTraceLimit -- ;
204+ stack = error . stack ;
205+ // Remove the stack title and the first stack line for `Logger.prototype.log`
206+ stack = stack . slice ( stack . indexOf ( '\n' , stack . indexOf ( '\n' ) + 1 ) + 1 ) ;
207+ } else {
208+ stack = new Error ( ) . stack ?? '' ;
209+ stack = stack . slice ( stack . indexOf ( '\n' ) + 1 ) ;
210+ }
211+ return stack ;
212+ } ,
112213 } ;
113214 }
114215
115216 protected callHandlers (
116217 record : LogRecord ,
218+ level : LogLevel ,
117219 format ?: LogFormatter ,
118220 keys : Array < string > = [ ] ,
119221 ) : void {
222+ // Filter on level before calling handlers
223+ // This is also called when traversing up the parent
224+ if ( level < this . getEffectiveLevel ( ) ) return ;
120225 keys . push ( this . key ) ;
121226 if ( this . filter != null ) {
122227 const keysPath = keys . reduce ( ( prev , curr ) => `${ curr } .${ prev } ` ) ;
@@ -126,7 +231,7 @@ class Logger {
126231 handler . handle ( record , format ) ;
127232 }
128233 if ( this . parent ) {
129- this . parent . callHandlers ( record , format , keys ) ;
234+ this . parent . callHandlers ( record , level , format , keys ) ;
130235 }
131236 }
132237}
0 commit comments