44 */
55
66import * as vscode from 'vscode'
7+ import { LogTopic , type ToolkitLogger } from './toolkitLogger'
78
89const toolkitLoggers : {
910 main : Logger | undefined
10- channel : Logger | undefined
1111 debugConsole : Logger | undefined
12- } = { main : undefined , channel : undefined , debugConsole : undefined }
12+ } = { main : undefined , debugConsole : undefined }
1313
1414export interface Logger {
15- debug ( message : string , ...meta : any [ ] ) : number
16- debug ( error : Error , ...meta : any [ ] ) : number
17- verbose ( message : string , ...meta : any [ ] ) : number
18- verbose ( error : Error , ...meta : any [ ] ) : number
19- info ( message : string , ...meta : any [ ] ) : number
20- info ( error : Error , ...meta : any [ ] ) : number
21- warn ( message : string , ...meta : any [ ] ) : number
22- warn ( error : Error , ...meta : any [ ] ) : number
23- error ( message : string , ...meta : any [ ] ) : number
24- error ( error : Error , ...meta : any [ ] ) : number
25- log ( logLevel : LogLevel , message : string , ...meta : any [ ] ) : number
26- log ( logLevel : LogLevel , error : Error , ...meta : any [ ] ) : number
15+ debug ( message : string | Error , ...meta : any [ ] ) : number
16+ verbose ( message : string | Error , ...meta : any [ ] ) : number
17+ info ( message : string | Error , ...meta : any [ ] ) : number
18+ warn ( message : string | Error , ...meta : any [ ] ) : number
19+ error ( message : string | Error , ...meta : any [ ] ) : number
20+ log ( logLevel : LogLevel , message : string | Error , ...meta : any [ ] ) : number
2721 setLogLevel ( logLevel : LogLevel ) : void
2822 /** Returns true if the given log level is being logged. */
2923 logLevelEnabled ( logLevel : LogLevel ) : boolean
@@ -32,6 +26,38 @@ export interface Logger {
3226 enableDebugConsole ( ) : void
3327}
3428
29+ export abstract class BaseLogger implements Logger {
30+ debug ( message : string | Error , ...meta : any [ ] ) : number {
31+ return this . sendToLog ( 'debug' , message , meta )
32+ }
33+ verbose ( message : string | Error , ...meta : any [ ] ) : number {
34+ return this . sendToLog ( 'verbose' , message , meta )
35+ }
36+ info ( message : string | Error , ...meta : any [ ] ) : number {
37+ return this . sendToLog ( 'info' , message , meta )
38+ }
39+ warn ( message : string | Error , ...meta : any [ ] ) : number {
40+ return this . sendToLog ( 'warn' , message , meta )
41+ }
42+ error ( message : string | Error , ...meta : any [ ] ) : number {
43+ return this . sendToLog ( 'error' , message , meta )
44+ }
45+ log ( logLevel : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
46+ return this . sendToLog ( logLevel , message , ...meta )
47+ }
48+ abstract setLogLevel ( logLevel : LogLevel ) : void
49+ abstract logLevelEnabled ( logLevel : LogLevel ) : boolean
50+ abstract getLogById ( logID : number , file : vscode . Uri ) : string | undefined
51+ /** HACK: Enables logging to vscode Debug Console. */
52+ abstract enableDebugConsole ( ) : void
53+
54+ abstract sendToLog (
55+ logLevel : 'debug' | 'verbose' | 'info' | 'warn' | 'error' ,
56+ message : string | Error ,
57+ ...meta : any [ ]
58+ ) : number
59+ }
60+
3561/**
3662 * Log levels ordered for comparison.
3763 *
@@ -85,107 +111,91 @@ export function compareLogLevel(l1: LogLevel, l2: LogLevel): number {
85111/**
86112 * Gets the logger if it has been initialized
87113 * the logger is of `'main'` or `undefined`: Main logger; default impl: logs to log file and log output channel
114+ * @param topic: topic to be appended in front of the message.
88115 */
89- export function getLogger ( ) : Logger {
116+ export function getLogger ( topic ?: LogTopic ) : Logger {
90117 const logger = toolkitLoggers [ 'main' ]
91118 if ( ! logger ) {
92119 return new ConsoleLogger ( )
93120 }
94-
121+ /**
122+ * need this check so that setTopic can be recognized
123+ * using instanceof would lead to dependency loop error
124+ */
125+ if ( isToolkitLogger ( logger ) ) {
126+ logger . setTopic ( topic )
127+ }
95128 return logger
96129}
97130
98- export function getDebugConsoleLogger ( ) : Logger {
99- return toolkitLoggers [ 'debugConsole' ] ?? new ConsoleLogger ( )
131+ /**
132+ * check if the logger is of type `ToolkitLogger`. This avoids Circular Dependencies, but `instanceof ToolkitLogger` is preferred.
133+ * @param logger
134+ * @returns bool, true if is `ToolkitLogger`
135+ */
136+ function isToolkitLogger ( logger : Logger ) : logger is ToolkitLogger {
137+ return 'setTopic' in logger && typeof logger . setTopic === 'function'
138+ }
139+
140+ export function getDebugConsoleLogger ( topic ?: LogTopic ) : Logger {
141+ const logger = toolkitLoggers [ 'debugConsole' ]
142+ if ( ! logger ) {
143+ return new ConsoleLogger ( )
144+ }
145+ if ( isToolkitLogger ( logger ) ) {
146+ logger . setTopic ( topic )
147+ }
148+ return logger
100149}
101150
102- export class NullLogger implements Logger {
151+ export class NullLogger extends BaseLogger {
103152 public setLogLevel ( logLevel : LogLevel ) { }
104153 public logLevelEnabled ( logLevel : LogLevel ) : boolean {
105154 return false
106155 }
107- public log ( logLevel : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
108- return 0
109- }
110- public debug ( message : string | Error , ...meta : any [ ] ) : number {
111- return 0
112- }
113- public verbose ( message : string | Error , ...meta : any [ ] ) : number {
114- return 0
115- }
116- public info ( message : string | Error , ...meta : any [ ] ) : number {
117- return 0
118- }
119- public warn ( message : string | Error , ...meta : any [ ] ) : number {
120- return 0
121- }
122- public error ( message : string | Error , ...meta : any [ ] ) : number {
123- return 0
124- }
125156 public getLogById ( logID : number , file : vscode . Uri ) : string | undefined {
126157 return undefined
127158 }
128159 public enableDebugConsole ( ) : void { }
160+ override sendToLog (
161+ logLevel : 'error' | 'warn' | 'info' | 'verbose' | 'debug' ,
162+ message : string | Error ,
163+ ...meta : any [ ]
164+ ) : number {
165+ return 0
166+ }
129167}
130168
131169/**
132170 * Fallback used if {@link getLogger()} is requested before logging is fully initialized.
133171 */
134- export class ConsoleLogger implements Logger {
172+ export class ConsoleLogger extends BaseLogger {
135173 public setLogLevel ( logLevel : LogLevel ) { }
136174 public logLevelEnabled ( logLevel : LogLevel ) : boolean {
137175 return false
138176 }
139- public log ( logLevel : LogLevel , message : string | Error , ...meta : any [ ] ) : number {
140- switch ( logLevel ) {
141- case 'error' :
142- this . error ( message , ...meta )
143- return 0
144- case 'warn' :
145- this . warn ( message , ...meta )
146- return 0
147- case 'verbose' :
148- this . verbose ( message , ...meta )
149- return 0
150- case 'debug' :
151- this . debug ( message , ...meta )
152- return 0
153- case 'info' :
154- default :
155- this . info ( message , ...meta )
156- return 0
157- }
158- }
159- public debug ( message : string | Error , ...meta : any [ ] ) : number {
160- // eslint-disable-next-line aws-toolkits/no-console-log
161- console . debug ( message , ...meta )
162- return 0
163- }
164- public verbose ( message : string | Error , ...meta : any [ ] ) : number {
165- // eslint-disable-next-line aws-toolkits/no-console-log
166- console . debug ( message , ...meta )
167- return 0
168- }
169- public info ( message : string | Error , ...meta : any [ ] ) : number {
170- // eslint-disable-next-line aws-toolkits/no-console-log
171- console . info ( message , ...meta )
172- return 0
173- }
174- public warn ( message : string | Error , ...meta : any [ ] ) : number {
175- // eslint-disable-next-line aws-toolkits/no-console-log
176- console . warn ( message , ...meta )
177- return 0
178- }
179- /** Note: In nodejs this prints to `stderr` (see {@link Console.error}). */
180- public error ( message : string | Error , ...meta : any [ ] ) : number {
181- // eslint-disable-next-line aws-toolkits/no-console-log
182- console . error ( message , ...meta )
183- return 0
184- }
185177 public getLogById ( logID : number , file : vscode . Uri ) : string | undefined {
186178 return undefined
187179 }
188180 public enableDebugConsole ( ) : void { }
181+ override sendToLog (
182+ logLevel : 'error' | 'warn' | 'info' | 'verbose' | 'debug' ,
183+ message : string | Error ,
184+ ...meta : any [ ]
185+ ) : number {
186+ /**
187+ * This is here because we pipe verbose to debug currentlly
188+ * TODO: remove in the next stage
189+ */
190+ if ( logLevel === 'verbose' ) {
191+ // eslint-disable-next-line aws-toolkits/no-console-log
192+ console . debug ( message , ...meta )
193+ } else {
194+ // eslint-disable-next-line aws-toolkits/no-console-log
195+ console [ logLevel ] ( message , ...meta )
196+ }
197+ return 0
198+ }
189199}
190200
191201export function getNullLogger ( type ?: 'debugConsole' | 'main' ) : Logger {
0 commit comments