1
- import type { ToString , LogRecord , LogFormatter } from './types' ;
1
+ import type { ToString , LogData , LogRecord , LogFormatter } from './types' ;
2
2
import type Handler from './Handler' ;
3
-
4
3
import { LogLevel } from './types' ;
5
4
import ConsoleErrHandler from './handlers/ConsoleErrHandler' ;
5
+ import * as utils from './utils' ;
6
6
7
7
class Logger {
8
8
public key : string ;
@@ -75,48 +75,153 @@ class Logger {
75
75
}
76
76
}
77
77
78
- public setFilter ( filter : RegExp ) {
78
+ public setFilter ( filter : RegExp ) : void {
79
79
this . filter = filter ;
80
80
}
81
81
82
- public debug ( data : ToString , format ?: LogFormatter ) : void {
83
- this . log ( data . toString ( ) , LogLevel . DEBUG , format ) ;
82
+ public unsetFilter ( ) : void {
83
+ delete this . filter ;
84
84
}
85
85
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
+ }
88
102
}
89
103
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
+ }
92
120
}
93
121
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
+ }
96
138
}
97
139
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 ) ;
102
155
}
103
156
}
104
157
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 {
106
180
return {
181
+ logger : this ,
107
182
key : this . key ,
108
183
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
+ } ,
112
213
} ;
113
214
}
114
215
115
216
protected callHandlers (
116
217
record : LogRecord ,
218
+ level : LogLevel ,
117
219
format ?: LogFormatter ,
118
220
keys : Array < string > = [ ] ,
119
221
) : void {
222
+ // Filter on level before calling handlers
223
+ // This is also called when traversing up the parent
224
+ if ( level < this . getEffectiveLevel ( ) ) return ;
120
225
keys . push ( this . key ) ;
121
226
if ( this . filter != null ) {
122
227
const keysPath = keys . reduce ( ( prev , curr ) => `${ curr } .${ prev } ` ) ;
@@ -126,7 +231,7 @@ class Logger {
126
231
handler . handle ( record , format ) ;
127
232
}
128
233
if ( this . parent ) {
129
- this . parent . callHandlers ( record , format , keys ) ;
234
+ this . parent . callHandlers ( record , level , format , keys ) ;
130
235
}
131
236
}
132
237
}
0 commit comments