1
- import type { ToString , LogRecord , LogFormatter } from './types' ;
1
+ import type { 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,131 @@ 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 : 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
+ }
88
98
}
89
99
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
+ }
92
112
}
93
113
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
+ }
96
126
}
97
127
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 ) ;
102
139
}
103
140
}
104
141
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 {
106
158
return {
159
+ logger : this ,
107
160
key : this . key ,
108
161
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
+ } ,
112
191
} ;
113
192
}
114
193
115
194
protected callHandlers (
116
195
record : LogRecord ,
196
+ level : LogLevel ,
117
197
format ?: LogFormatter ,
118
198
keys : Array < string > = [ ] ,
119
199
) : void {
200
+ if ( level < this . getEffectiveLevel ( ) ) {
201
+ return ;
202
+ }
120
203
keys . push ( this . key ) ;
121
204
if ( this . filter != null ) {
122
205
const keysPath = keys . reduce ( ( prev , curr ) => `${ curr } .${ prev } ` ) ;
@@ -126,7 +209,7 @@ class Logger {
126
209
handler . handle ( record , format ) ;
127
210
}
128
211
if ( this . parent ) {
129
- this . parent . callHandlers ( record , format , keys ) ;
212
+ this . parent . callHandlers ( record , level , format , keys ) ;
130
213
}
131
214
}
132
215
}
0 commit comments