@@ -7,16 +7,14 @@ import fx from 'mkdir-recursive';
7
7
import { rimrafSync } from 'rimraf' ;
8
8
import assert from 'assert' ;
9
9
10
- const LOG_LEVELS = [ 'error' , 'warning' , 'info' , 'debug' ] as const ;
11
- type LogLevel = typeof LOG_LEVELS [ number ] ;
12
-
13
10
class Logger {
14
- private level : LogLevel ;
11
+ private level : settings . LogLevel ;
15
12
private output : string [ ] ;
16
13
private directory : string ;
17
14
private logger : winston . Logger ;
18
15
private fileTransport : winston . transports . FileTransportInstance ;
19
16
private debugNamespaceIgnoreRegex ?: RegExp ;
17
+ private namespacedLevels : Record < string , settings . LogLevel > ;
20
18
21
19
public init ( ) : void {
22
20
// What transports to enable
@@ -25,20 +23,18 @@ class Logger {
25
23
const timestamp = moment ( Date . now ( ) ) . format ( 'YYYY-MM-DD.HH-mm-ss' ) ;
26
24
this . directory = settings . get ( ) . advanced . log_directory . replace ( '%TIMESTAMP%' , timestamp ) ;
27
25
const logFilename = settings . get ( ) . advanced . log_file . replace ( '%TIMESTAMP%' , timestamp ) ;
28
- // Determine the log level.
29
- const settingLevel = settings . get ( ) . advanced . log_level ;
30
- // workaround for syslog<>npm level conflict
31
- this . level = settingLevel === 'warn' ? 'warning' : settingLevel ;
26
+ this . level = settings . get ( ) . advanced . log_level ;
27
+ this . namespacedLevels = settings . get ( ) . advanced . log_namespaced_levels ;
32
28
33
29
assert (
34
- LOG_LEVELS . includes ( this . level ) ,
35
- `'${ this . level } ' is not valid log_level, use one of '${ LOG_LEVELS . join ( ', ' ) } '` ,
30
+ settings . LOG_LEVELS . includes ( this . level ) ,
31
+ `'${ this . level } ' is not valid log_level, use one of '${ settings . LOG_LEVELS . join ( ', ' ) } '` ,
36
32
) ;
37
33
38
34
const timestampFormat = ( ) : string => moment ( ) . format ( settings . get ( ) . advanced . timestamp_format ) ;
39
35
40
36
this . logger = winston . createLogger ( {
41
- level : this . level ,
37
+ level : 'debug' ,
42
38
format : winston . format . combine (
43
39
winston . format . errors ( { stack : true } ) ,
44
40
winston . format . timestamp ( { format : timestampFormat } ) ,
@@ -81,9 +77,8 @@ class Logger {
81
77
// Add file logger when enabled
82
78
// eslint-disable-next-line max-len
83
79
// NOTE: the initiation of the logger even when not added as transport tries to create the logging directory
84
- const transportFileOptions : KeyValue = {
80
+ const transportFileOptions : winston . transports . FileTransportOptions = {
85
81
filename : path . join ( this . directory , logFilename ) ,
86
- json : false ,
87
82
format : winston . format . printf ( /* istanbul ignore next */ ( info ) => {
88
83
return `[${ info . timestamp } ] ${ info . level } : \t${ info . namespace } : ${ info . message } ` ;
89
84
} ) ,
@@ -131,7 +126,6 @@ class Logger {
131
126
}
132
127
133
128
public addTransport ( transport : winston . transport ) : void {
134
- transport . level = this . level ;
135
129
this . logger . add ( transport ) ;
136
130
}
137
131
@@ -147,41 +141,48 @@ class Logger {
147
141
this . debugNamespaceIgnoreRegex = value != '' ? new RegExp ( value ) : undefined ;
148
142
}
149
143
150
- // TODO refactor Z2M level to 'warning' to simplify logic
151
- public getLevel ( ) : LogLevel | 'warn' {
152
- return this . level === 'warning' ? 'warn' : this . level ;
144
+ public getLevel ( ) : settings . LogLevel {
145
+ return this . level ;
153
146
}
154
147
155
- public setLevel ( level : LogLevel | 'warn' ) : void {
156
- if ( level === 'warn' ) {
157
- level = 'warning' ;
148
+ public setLevel ( level : settings . LogLevel ) : void {
149
+ this . level = level ;
150
+ }
151
+
152
+ public getNamespacedLevels ( ) : Record < string , settings . LogLevel > {
153
+ return this . namespacedLevels ;
154
+ }
155
+
156
+ public setNamespacedLevels ( nsLevels : Record < string , settings . LogLevel > ) : void {
157
+ this . namespacedLevels = nsLevels ;
158
+ }
159
+
160
+ private log ( level : settings . LogLevel , message : string , namespace : string ) : void {
161
+ const nsLevel = this . namespacedLevels [ namespace ] ?? this . level ;
162
+
163
+ if ( settings . LOG_LEVELS . indexOf ( level ) <= settings . LOG_LEVELS . indexOf ( nsLevel ) ) {
164
+ this . logger . log ( level , message , { namespace} ) ;
158
165
}
166
+ }
159
167
160
- this . level = level ;
161
- this . logger . transports . forEach ( ( transport ) => transport . level = this . level ) ;
168
+ public error ( message : string , namespace : string = 'z2m' ) : void {
169
+ this . log ( 'error' , message , namespace ) ;
162
170
}
163
171
164
172
public warning ( message : string , namespace : string = 'z2m' ) : void {
165
- this . logger . warning ( message , { namespace} ) ;
173
+ this . log ( 'warning' , message , namespace ) ;
166
174
}
167
175
168
176
public info ( message : string , namespace : string = 'z2m' ) : void {
169
- this . logger . info ( message , { namespace} ) ;
177
+ this . log ( 'info' , message , namespace ) ;
170
178
}
171
179
172
180
public debug ( message : string , namespace : string = 'z2m' ) : void {
173
- if ( this . level !== 'debug' ) {
174
- return ;
175
- }
176
181
if ( this . debugNamespaceIgnoreRegex ?. test ( namespace ) ) {
177
182
return ;
178
183
}
179
184
180
- this . logger . debug ( message , { namespace} ) ;
181
- }
182
-
183
- public error ( message : string , namespace : string = 'z2m' ) : void {
184
- this . logger . error ( message , { namespace} ) ;
185
+ this . log ( 'debug' , message , namespace ) ;
185
186
}
186
187
187
188
// Cleanup any old log directory.
0 commit comments