diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 823ec1cd2e06d2098671809eec386100be56e478..f7019d95418e1c906cff8a5eb2f2370058779f14 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -7,8 +7,10 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { createDecorator as createServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { isWindows } from 'vs/base/common/platform'; +import Event, { Emitter } from 'vs/base/common/event'; +import { LogLevelChannelClient } from 'vs/platform/log/common/logIpc'; export const ILogService = createServiceDecorator('logService'); @@ -25,6 +27,7 @@ export enum LogLevel { export interface ILogService extends IDisposable { _serviceBrand: any; + onDidChangeLogLevel: Event; setLevel(level: LogLevel): void; getLevel(): LogLevel; trace(message: string, ...args: any[]): void; @@ -35,27 +38,37 @@ export interface ILogService extends IDisposable { critical(message: string | Error, ...args: any[]): void; } -export class ConsoleLogMainService implements ILogService { +export abstract class AbstractLogService extends Disposable { - _serviceBrand: any; private level: LogLevel = LogLevel.Error; - private useColors: boolean; - - constructor( @IEnvironmentService environmentService: IEnvironmentService) { - this.setLevel(environmentService.logLevel); - this.useColors = !isWindows; - } + private readonly _onDidChangeLogLevel: Emitter = this._register(new Emitter()); + readonly onDidChangeLogLevel: Event = this._onDidChangeLogLevel.event; setLevel(level: LogLevel): void { - this.level = level; + if (this.level !== level) { + this.level = level; + this._onDidChangeLogLevel.fire(this.level); + } } getLevel(): LogLevel { return this.level; } +} + +export class ConsoleLogMainService extends AbstractLogService implements ILogService { + + _serviceBrand: any; + private useColors: boolean; + + constructor( @IEnvironmentService environmentService: IEnvironmentService) { + super(); + this.setLevel(environmentService.logLevel); + this.useColors = !isWindows; + } trace(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Trace) { + if (this.getLevel() <= LogLevel.Trace) { if (this.useColors) { console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); } else { @@ -65,7 +78,7 @@ export class ConsoleLogMainService implements ILogService { } debug(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Debug) { + if (this.getLevel() <= LogLevel.Debug) { if (this.useColors) { console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); } else { @@ -75,7 +88,7 @@ export class ConsoleLogMainService implements ILogService { } info(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Info) { + if (this.getLevel() <= LogLevel.Info) { if (this.useColors) { console.log(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); } else { @@ -85,7 +98,7 @@ export class ConsoleLogMainService implements ILogService { } warn(message: string | Error, ...args: any[]): void { - if (this.level <= LogLevel.Warning) { + if (this.getLevel() <= LogLevel.Warning) { if (this.useColors) { console.warn(`\x1b[93m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); } else { @@ -95,7 +108,7 @@ export class ConsoleLogMainService implements ILogService { } error(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Error) { + if (this.getLevel() <= LogLevel.Error) { if (this.useColors) { console.error(`\x1b[91m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); } else { @@ -105,7 +118,7 @@ export class ConsoleLogMainService implements ILogService { } critical(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Critical) { + if (this.getLevel() <= LogLevel.Critical) { if (this.useColors) { console.error(`\x1b[90m[main ${new Date().toLocaleTimeString()}]\x1b[0m`, message, ...args); } else { @@ -119,55 +132,47 @@ export class ConsoleLogMainService implements ILogService { } } -export class ConsoleLogService implements ILogService { +export class ConsoleLogService extends AbstractLogService implements ILogService { _serviceBrand: any; - private level: LogLevel = LogLevel.Error; constructor( @IEnvironmentService environmentService: IEnvironmentService) { + super(); this.setLevel(environmentService.logLevel); } - setLevel(level: LogLevel): void { - this.level = level; - } - - getLevel(): LogLevel { - return this.level; - } - trace(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Trace) { + if (this.getLevel() <= LogLevel.Trace) { console.log('%cTRACE', 'color: #888', message, ...args); } } debug(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Debug) { + if (this.getLevel() <= LogLevel.Debug) { console.log('%cDEBUG', 'background: #eee; color: #888', message, ...args); } } info(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Info) { + if (this.getLevel() <= LogLevel.Info) { console.log('%c INFO', 'color: #33f', message, ...args); } } warn(message: string | Error, ...args: any[]): void { - if (this.level <= LogLevel.Warning) { + if (this.getLevel() <= LogLevel.Warning) { console.log('%c WARN', 'color: #993', message, ...args); } } error(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Error) { + if (this.getLevel() <= LogLevel.Error) { console.log('%c ERR', 'color: #f33', message, ...args); } } critical(message: string, ...args: any[]): void { - if (this.level <= LogLevel.Critical) { + if (this.getLevel() <= LogLevel.Critical) { console.log('%cCRITI', 'background: #f33; color: white', message, ...args); } } @@ -175,22 +180,18 @@ export class ConsoleLogService implements ILogService { dispose(): void { } } -export class MultiplexLogService implements ILogService { +export class MultiplexLogService extends AbstractLogService implements ILogService { _serviceBrand: any; - constructor(private logServices: ILogService[]) { } + constructor(private logServices: ILogService[]) { + super(); + } setLevel(level: LogLevel): void { for (const logService of this.logServices) { logService.setLevel(level); } - } - - getLevel(): LogLevel { - for (const logService of this.logServices) { - return logService.getLevel(); - } - return LogLevel.Info; + super.setLevel(level); } trace(message: string, ...args: any[]): void { @@ -236,8 +237,50 @@ export class MultiplexLogService implements ILogService { } } +export class FollowerLogService extends AbstractLogService implements ILogService { + _serviceBrand: any; + + constructor(private client: LogLevelChannelClient, private logService: ILogService) { + super(); + this._register(client.onDidChangeLogLevel(level => logService.setLevel(level))); + } + + setLevel(level: LogLevel): void { + this.client.setLogLevel(level); + } + + trace(message: string, ...args: any[]): void { + this.logService.trace(message, ...args); + } + + debug(message: string, ...args: any[]): void { + this.logService.debug(message, ...args); + } + + info(message: string, ...args: any[]): void { + this.logService.info(message, ...args); + } + + warn(message: string, ...args: any[]): void { + this.logService.warn(message, ...args); + } + + error(message: string | Error, ...args: any[]): void { + this.logService.error(message, ...args); + } + + critical(message: string | Error, ...args: any[]): void { + this.logService.critical(message, ...args); + } + + dispose(): void { + this.logService.dispose(); + } +} + export class NullLogService implements ILogService { _serviceBrand: any; + readonly onDidChangeLogLevel: Event = new Emitter().event; setLevel(level: LogLevel): void { } getLevel(): LogLevel { return LogLevel.Info; } trace(message: string, ...args: any[]): void { }