/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { createDecorator as createServiceDecorator } from '../../../../vs/platform/instantiation/common/instantiation'; import { IDisposable, Disposable } from '../../../../vs/base/common/lifecycle'; import { Emitter } from '../../../../vs/base/common/event'; export const ILogService = createServiceDecorator('logService'); export enum LogLevel { Trace, Debug, Info, Warning, Error, Critical, Off, } export const DEFAULT_LOG_LEVEL: LogLevel = LogLevel.Info; export interface ILogger extends IDisposable { getLevel(): LogLevel; trace(message: string, ...args: any[]): void; debug(message: string, ...args: any[]): void; info(message: string, ...args: any[]): void; error(message: string | Error, ...args: any[]): void; } export interface ILogService extends ILogger { readonly _serviceBrand: undefined; } export abstract class AbstractLogger extends Disposable { private level: LogLevel = DEFAULT_LOG_LEVEL; private readonly _onDidChangeLogLevel: Emitter = this._register( new Emitter() ); setLevel(level: LogLevel): void { if (this.level !== level) { this.level = level; this._onDidChangeLogLevel.fire(this.level); } } getLevel(): LogLevel { return this.level; } } export class ConsoleLogger extends AbstractLogger implements ILogger { constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { super(); this.setLevel(logLevel); } trace(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Trace) { console.log('%cTRACE', 'color: #888', message, ...args); } } debug(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Debug) { console.log('%cDEBUG', 'background: #eee; color: #888', message, ...args); } } info(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Info) { console.log('%c INFO', 'color: #33f', message, ...args); } } error(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Error) { console.log('%c ERR', 'color: #f33', message, ...args); } } override dispose(): void { // noop } } export class LogService extends Disposable implements ILogService { declare readonly _serviceBrand: undefined; constructor(private logger: ILogger) { super(); this._register(logger); } getLevel(): LogLevel { return this.logger.getLevel(); } trace(message: string, ...args: any[]): void { this.logger.trace(message, ...args); } debug(message: string, ...args: any[]): void { this.logger.debug(message, ...args); } info(message: string, ...args: any[]): void { this.logger.info(message, ...args); } error(message: string | Error, ...args: any[]): void { this.logger.error(message, ...args); } }