199
return result;
200
}
202
>
export type LoggerGroup = {
203
>
readonly id: string;
204
>
readonly name: string;
205
>
};
206
>
207
>
export interface ILogService extends ILogger {
208
>
readonly _serviceBrand: undefined;
209
>
}
210
>
211
>
export interface ILoggerOptions {
212
>
213
>
/**
214
>
* Id of the logger.
215
>
*/
216
>
id?: string;
217
>
218
>
/**
219
>
* Name of the logger.
220
>
*/
221
>
name?: string;
222
>
223
>
/**
224
>
* Do not create rotating files if max size exceeds.
225
>
*/
226
>
donotRotate?: boolean;
227
>
228
>
/**
229
>
* Do not use formatters.
230
>
*/
231
>
donotUseFormatters?: boolean;
232
>
233
>
/**
234
>
* When to log. Set to `always` to log always.
235
>
*/
236
>
logLevel?: 'always' | LogLevel;
237
>
238
>
/**
239
>
* Whether the log should be hidden from the user.
240
>
*/
241
>
hidden?: boolean;
242
>
243
>
/**
244
>
* Condition which must be true to show this logger
245
>
*/
246
>
when?: string;
247
>
248
>
/**
249
>
* Id of the extension that created this logger.
250
>
*/
251
>
extensionId?: string;
252
>
253
>
/**
254
>
* Group of the logger.
255
>
*/
256
>
group?: LoggerGroup;
257
>
}
258
>
259
>
export interface ILoggerResource {
260
>
readonly resource: URI;
261
>
readonly id: string;
262
>
readonly name?: string;
263
>
readonly logLevel?: LogLevel;
264
>
readonly hidden?: boolean;
265
>
readonly when?: string;
266
>
readonly extensionId?: string;
267
>
readonly group?: LoggerGroup;
268
>
}
269
>
270
>
export type DidChangeLoggersEvent = {
271
>
readonly added: Iterable<ILoggerResource>;
272
>
readonly removed: Iterable<ILoggerResource>;
273
>
};
274
>
275
>
export interface ILoggerService {
276
>
277
>
readonly _serviceBrand: undefined;
278
>
279
>
/**
280
>
* Creates a logger for the given resource, or gets one if it already exists.
281
>
*
282
>
* This will also register the logger with the logger service.
283
>
*/
284
>
createLogger(resource: URI, options?: ILoggerOptions): ILogger;
285
>
286
>
/**
287
>
* Creates a logger with the given id in the logs folder, or gets one if it already exists.
288
>
*
289
>
* This will also register the logger with the logger service.
290
>
*/
291
>
createLogger(id: string, options?: Omit<ILoggerOptions, 'id'>): ILogger;
292
>
293
>
/**
294
>
* Gets an existing logger, if any.
295
>
*/
296
>
getLogger(resourceOrId: URI | string): ILogger | undefined;
297
>
298
>
/**
299
>
* An event which fires when the log level of a logger has changed
300
>
*/
301
>
readonly onDidChangeLogLevel: Event<LogLevel | [URI, LogLevel]>;
302
>
303
>
/**
304
>
* Set default log level.
305
>
*/
306
>
setLogLevel(level: LogLevel): void;
307
>
308
>
/**
309
>
* Set log level for a logger.
310
>
*/
311
>
setLogLevel(resource: URI, level: LogLevel): void;
312
>
313
>
/**
314
>
* Get log level for a logger or the default log level.
315
>
*/
316
>
getLogLevel(resource?: URI): LogLevel;
317
>
318
>
/**
319
>
* An event which fires when the visibility of a logger has changed
320
>
*/
321
>
readonly onDidChangeVisibility: Event<[URI, boolean]>;
322
>
323
>
/**
324
>
* Set the visibility of a logger.
325
>
*/
326
>
setVisibility(resourceOrId: URI | string, visible: boolean): void;
327
>
328
>
/**
329
>
* An event which fires when the logger resources are changed
330
>
*/
331
>
readonly onDidChangeLoggers: Event<DidChangeLoggersEvent>;
332
>
333
>
/**
334
>
* Register a logger with the logger service.
335
>
*
336
>
* Note that this will not create a logger, but only register it.
337
>
*
338
>
* Use `createLogger` to create a logger and register it.
339
>
*
340
>
* Use it when you want to register a logger that is not created by the logger service.
341
>
*/
342
>
registerLogger(resource: ILoggerResource): void;
343
>
344
>
/**
345
>
* Deregister the logger for the given resource.
346
>
*/
347
>
deregisterLogger(idOrResource: URI | string): void;
348
>
349
>
/**
350
>
* Get all registered loggers
351
>
*/
352
>
getRegisteredLoggers(): Iterable<ILoggerResource>;
353
>
354
>
/**
355
>
* Get the registered logger for the given resource.
356
>
*/
357
>
getRegisteredLogger(resource: URI): ILoggerResource | undefined;
358
>
}
359
>
360
>
export abstract class AbstractLogger extends Disposable implements ILogger {
361
362
private level: LogLevel = DEFAULT_LOG_LEVEL;
363
private readonly _onDidChangeLogLevel: Emitter<LogLevel> = this._register(new Emitter<LogLevel>());
364
>
get onDidChangeLogLevel(): Event<LogLevel> { return this._onDidChangeLogLevel.event; }
log.ts
365
>
366
>
setLevel(level: LogLevel): void {
367
if (this.level !== level) {
368
this.level = level;