@@ -7,6 +7,13 @@ import * as vscode from 'vscode'
7
7
8
8
export type LogTopic = 'crashReport' | 'notifications' | 'test' | 'unknown'
9
9
10
+ class ErrorLog {
11
+ constructor (
12
+ public topic : string ,
13
+ public error : Error
14
+ ) { }
15
+ }
16
+
10
17
const toolkitLoggers : {
11
18
main : Logger | undefined
12
19
debugConsole : Logger | undefined
@@ -30,16 +37,17 @@ export interface Logger {
30
37
getLogById ( logID : number , file : vscode . Uri ) : string | undefined
31
38
/** HACK: Enables logging to vscode Debug Console. */
32
39
enableDebugConsole ( ) : void
40
+ sendToLog (
41
+ logLevel : 'debug' | 'verbose' | 'info' | 'warn' | 'error' ,
42
+ message : string | Error ,
43
+ ...meta : any [ ]
44
+ ) : number
33
45
}
34
46
35
47
export abstract class BaseLogger implements Logger {
36
48
logFile ?: vscode . Uri
37
49
topic : LogTopic = 'unknown'
38
50
39
- setTopic ( topic : LogTopic = 'unknown' ) {
40
- this . topic = topic
41
- }
42
-
43
51
debug ( message : string | Error , ...meta : any [ ] ) : number {
44
52
return this . sendToLog ( 'debug' , message , ...meta )
45
53
}
@@ -58,17 +66,16 @@ export abstract class BaseLogger implements Logger {
58
66
log ( logLevel : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
59
67
return this . sendToLog ( logLevel , message , ...meta )
60
68
}
61
- abstract setLogLevel ( logLevel : LogLevel ) : void
62
- abstract logLevelEnabled ( logLevel : LogLevel ) : boolean
63
- abstract getLogById ( logID : number , file : vscode . Uri ) : string | undefined
64
- /** HACK: Enables logging to vscode Debug Console. */
65
- abstract enableDebugConsole ( ) : void
66
-
67
69
abstract sendToLog (
68
70
logLevel : 'debug' | 'verbose' | 'info' | 'warn' | 'error' ,
69
71
message : string | Error ,
70
72
...meta : any [ ]
71
73
) : number
74
+ abstract setLogLevel ( logLevel : LogLevel ) : void
75
+ abstract logLevelEnabled ( logLevel : LogLevel ) : boolean
76
+ abstract getLogById ( logID : number , file : vscode . Uri ) : string | undefined
77
+ /** HACK: Enables logging to vscode Debug Console. */
78
+ abstract enableDebugConsole ( ) : void
72
79
}
73
80
74
81
/**
@@ -121,6 +128,20 @@ export function compareLogLevel(l1: LogLevel, l2: LogLevel): number {
121
128
return logLevels . get ( l1 ) ! - logLevels . get ( l2 ) !
122
129
}
123
130
131
+ /* Format the message with topic header */
132
+ function prependTopic ( topic : string , message : string | Error ) : string | ErrorLog {
133
+ if ( typeof message === 'string' ) {
134
+ // TODO: remove this after all calls are migrated and topic is a required param.
135
+ if ( topic === 'unknown' ) {
136
+ return message
137
+ }
138
+ return `${ topic } : ` + message
139
+ } else if ( message instanceof Error ) {
140
+ return new ErrorLog ( topic , message )
141
+ }
142
+ return message
143
+ }
144
+
124
145
/**
125
146
* Gets the logger if it has been initialized
126
147
* the logger is of `'main'` or `undefined`: Main logger; default impl: logs to log file and log output channel
@@ -131,17 +152,15 @@ export function getLogger(topic?: LogTopic): Logger {
131
152
if ( ! logger ) {
132
153
return new ConsoleLogger ( )
133
154
}
134
- ; ( logger as BaseLogger ) . setTopic ?.( topic )
135
- return logger
155
+ return new TopicLogger ( topic ?? 'unknown' , logger )
136
156
}
137
157
138
158
export function getDebugConsoleLogger ( topic ?: LogTopic ) : Logger {
139
159
const logger = toolkitLoggers [ 'debugConsole' ]
140
160
if ( ! logger ) {
141
161
return new ConsoleLogger ( )
142
162
}
143
- ; ( logger as BaseLogger ) . setTopic ?.( topic )
144
- return logger
163
+ return new TopicLogger ( topic ?? 'unknown' , logger )
145
164
}
146
165
147
166
// jscpd:ignore-start
@@ -194,6 +213,46 @@ export class ConsoleLogger extends BaseLogger {
194
213
return 0
195
214
}
196
215
}
216
+
217
+ /**
218
+ * Wraps a `ToolkitLogger` and defers to it for everything except `topic`.
219
+ */
220
+ export class TopicLogger extends BaseLogger implements vscode . Disposable {
221
+ /**
222
+ * Wraps a `ToolkitLogger` and defers to it for everything except `topic`.
223
+ */
224
+ public constructor (
225
+ public override topic : LogTopic ,
226
+ public readonly logger : Logger
227
+ ) {
228
+ super ( )
229
+ }
230
+
231
+ override setLogLevel ( logLevel : LogLevel ) : void {
232
+ this . logger . setLogLevel ( logLevel )
233
+ }
234
+
235
+ override logLevelEnabled ( logLevel : LogLevel ) : boolean {
236
+ return this . logger . logLevelEnabled ( logLevel )
237
+ }
238
+
239
+ override getLogById ( logID : number , file : vscode . Uri ) : string | undefined {
240
+ return this . logger . getLogById ( logID , file )
241
+ }
242
+
243
+ override enableDebugConsole ( ) : void {
244
+ this . logger . enableDebugConsole ( )
245
+ }
246
+
247
+ override sendToLog ( level : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
248
+ if ( typeof message === 'string' ) {
249
+ message = prependTopic ( this . topic , message ) as string
250
+ }
251
+ return this . logger . sendToLog ( level , message , meta )
252
+ }
253
+
254
+ public async dispose ( ) : Promise < void > { }
255
+ }
197
256
// jscpd:ignore-end
198
257
199
258
export function getNullLogger ( type ?: 'debugConsole' | 'main' ) : Logger {
0 commit comments