From daa3a0ec2ec5a54dad8b8adf9da2b7c039524096 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 12 Dec 2017 19:07:41 -0800 Subject: [PATCH 1/5] Add ExtHostLogService with logger and lazily created log folder per extension --- src/vs/platform/log/node/spdlogService.ts | 5 +- src/vs/vscode.d.ts | 30 ++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 8 +- src/vs/workbench/api/node/extHost.protocol.ts | 7 +- .../api/node/extHostExtensionService.ts | 6 +- .../workbench/api/node/extHostLogService.ts | 95 +++++++++++++++++++ src/vs/workbench/api/node/extHostTypes.ts | 10 ++ src/vs/workbench/node/extensionHostMain.ts | 2 +- 8 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 src/vs/workbench/api/node/extHostLogService.ts diff --git a/src/vs/platform/log/node/spdlogService.ts b/src/vs/platform/log/node/spdlogService.ts index 726bd185dcb..d39af82182d 100644 --- a/src/vs/platform/log/node/spdlogService.ts +++ b/src/vs/platform/log/node/spdlogService.ts @@ -10,10 +10,11 @@ import { ILogService, LogLevel, NullLogService } from 'vs/platform/log/common/lo import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { RotatingLogger, setAsyncMode } from 'spdlog'; -export function createLogService(processName: string, environmentService: IEnvironmentService): ILogService { +export function createLogService(processName: string, environmentService: IEnvironmentService, logsSubfolder?: string): ILogService { try { setAsyncMode(8192, 2000); - const logfilePath = path.join(environmentService.logsPath, `${processName}.log`); + const logsDirPath = logsSubfolder ? path.join(environmentService.logsPath, logsSubfolder) : environmentService.logsPath; + const logfilePath = path.join(logsDirPath, `${processName}.log`); const logger = new RotatingLogger(processName, logfilePath, 1024 * 1024 * 5, 6); logger.setLevel(0); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 86982258339..65354174c44 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4325,6 +4325,29 @@ declare module 'vscode' { resolveTask(task: Task, token?: CancellationToken): ProviderResult; } + export enum LogLevel { + Trace = 1, + Debug = 2, + Info = 3, + Warning = 4, + Error = 5, + Critical = 6, + Off = 7 + } + + export interface ILogger { + onDidChangeLogLevel: Event; + getLevel(): LogLevel; + getLogDirectory(): Thenable; + + trace(message: string, ...args: any[]): void; + debug(message: string, ...args: any[]): void; + info(message: string, ...args: any[]): void; + warn(message: string, ...args: any[]): void; + error(message: string | Error, ...args: any[]): void; + critical(message: string | Error, ...args: any[]): void; + } + /** * Namespace describing the environment the editor runs in. */ @@ -4365,6 +4388,13 @@ declare module 'vscode' { * @readonly */ export let sessionId: string; + + /** + * Something + * + * @readonly + */ + export let logger: ILogger; } /** diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index ed71e123c75..6c3cdb9f832 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -59,6 +59,8 @@ import { toGlobPattern, toLanguageSelector } from 'vs/workbench/api/node/extHost import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; +import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; export interface IExtensionApiFactory { (extension: IExtensionDescription): typeof vscode; @@ -83,7 +85,8 @@ export function createApiFactory( extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, extensionService: ExtHostExtensionService, - logService: ILogService + logService: ILogService, + environmentService: IEnvironmentService ): IExtensionApiFactory { // Addressable instances @@ -121,6 +124,7 @@ export function createApiFactory( const extHostProgress = new ExtHostProgress(threadService.get(MainContext.MainThreadProgress)); const extHostOutputService = new ExtHostOutputService(threadService); const extHostLanguages = new ExtHostLanguages(threadService); + const extHostLogService = new ExtHostLogService(environmentService); // Register API-ish commands ExtHostApiCommands.register(extHostCommands); @@ -202,6 +206,7 @@ export function createApiFactory( get language() { return Platform.language; }, get appName() { return product.nameLong; }, get appRoot() { return initData.environment.appRoot; }, + get logger() { return extHostLogService.getExtLogger(extension.id); }, }); // namespace: extensions @@ -570,6 +575,7 @@ export function createApiFactory( Hover: extHostTypes.Hover, IndentAction: languageConfiguration.IndentAction, Location: extHostTypes.Location, + LogLevel: extHostTypes.LogLevel, MarkdownString: extHostTypes.MarkdownString, OverviewRulerLane: EditorCommon.OverviewRulerLane, ParameterInformation: extHostTypes.ParameterInformation, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index f9fd93dfa20..67091188abb 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -33,7 +33,7 @@ import { IConfigurationData, ConfigurationTarget, IConfigurationModel } from 'vs import { IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; -import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; +import { EndOfLine, TextEditorLineNumbersStyle, LogLevel } from 'vs/workbench/api/node/extHostTypes'; import { TaskSet } from 'vs/workbench/parts/tasks/common/tasks'; @@ -673,6 +673,10 @@ export interface ExtHostWindowShape { $onDidChangeWindowFocus(value: boolean): void; } +export interface ExtHostLogServiceShape { + $acceptLogLevelChanged(logLevel: LogLevel): void; +} + // --- proxy identifiers export const MainContext = { @@ -723,6 +727,7 @@ export const ExtHostContext = { ExtHostLanguageFeatures: createExtId('ExtHostLanguageFeatures'), ExtHostQuickOpen: createExtId('ExtHostQuickOpen'), ExtHostExtensionService: createExtId('ExtHostExtensionService'), + // ExtHostLogService: createExtId('ExtHostLogService'), ExtHostTerminalService: createExtId('ExtHostTerminalService'), ExtHostSCM: createExtId('ExtHostSCM'), ExtHostTask: createExtId('ExtHostTask'), diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 71a56b06be4..321b24b8f2b 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -21,6 +21,7 @@ import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { TernarySearchTree } from 'vs/base/common/map'; import { Barrier } from 'vs/base/common/async'; import { ILogService } from 'vs/platform/log/common/log'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; class ExtensionMemento implements IExtensionMemento { @@ -127,7 +128,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { threadService: ExtHostThreadService, extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, - logService: ILogService + logService: ILogService, + environmentService: IEnvironmentService ) { this._barrier = new Barrier(); this._registry = new ExtensionDescriptionRegistry(initData.extensions); @@ -140,7 +142,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._activator = null; // initialize API first (i.e. do not release barrier until the API is initialized) - const apiFactory = createApiFactory(initData, threadService, extHostWorkspace, extHostConfiguration, this, logService); + const apiFactory = createApiFactory(initData, threadService, extHostWorkspace, extHostConfiguration, this, logService, environmentService); initializeExtensionApi(this, apiFactory).then(() => { diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts new file mode 100644 index 00000000000..347dc8c6be0 --- /dev/null +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as path from 'path'; +import * as vscode from 'vscode'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { mkdirp, dirExists } from 'vs/base/node/pfs'; +import Event, { Emitter } from 'vs/base/common/event'; +import { ExtHostLogServiceShape } from './extHost.protocol'; +import { LogLevel } from 'vs/workbench/api/node/extHostTypes'; +import { ILogService } from 'vs/platform/log/common/log'; +import { createLogService } from 'vs/platform/log/node/spdlogService'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; + +export class ExtHostLogService implements ExtHostLogServiceShape { + private _loggers: Map = new Map(); + + private _onDidChangeLogLevel: Emitter; + get onDidChangeLogLevel(): Event { return this._onDidChangeLogLevel.event; } + + constructor(private _environmentService: IEnvironmentService) { + this._onDidChangeLogLevel = new Emitter(); + } + + $acceptLogLevelChanged(logLevel: LogLevel): void { + this._onDidChangeLogLevel.fire(logLevel); + } + + getExtLogger(extensionID: string): ExtHostLogger { + if (!this._loggers.has(extensionID)) { + const logService = createLogService(extensionID, this._environmentService, extensionID); + const logsDirPath = path.join(this._environmentService.logsPath, extensionID); + this._loggers.set(extensionID, new ExtHostLogger(this, logService, logsDirPath)); + } + + return this._loggers.get(extensionID); + } +} + +export class ExtHostLogger implements vscode.ILogger { + private _currentLevel: LogLevel; + + get onDidChangeLogLevel(): Event { return this._extHostLogService.onDidChangeLogLevel; } + + constructor( + private readonly _extHostLogService: ExtHostLogService, + private readonly _logService: ILogService, + private readonly _logDirectory: string + ) { + this._extHostLogService.onDidChangeLogLevel(logLevel => this._currentLevel = logLevel); + } + + getLogDirectory(): TPromise { + return dirExists(this._logDirectory).then(exists => { + if (exists) { + return TPromise.wrap(null); + } else { + return mkdirp(this._logDirectory); + } + }).then(() => { + return this._logDirectory; + }); + } + + getLevel(): vscode.LogLevel { + return this._currentLevel; + } + + trace(message: string, ...args: any[]): void { + return this._logService.trace(message, ...args); + } + + debug(message: string, ...args: any[]): void { + return this._logService.debug(message, ...args); + } + + info(message: string, ...args: any[]): void { + return this._logService.info(message, ...args); + } + + warn(message: string, ...args: any[]): void { + return this._logService.warn(message, ...args); + } + + error(message: string | Error, ...args: any[]): void { + return this._logService.error(message, ...args); + } + + critical(message: string | Error, ...args: any[]): void { + return this._logService.critical(message, ...args); + } +} diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index b0cc9b02062..a81d0c845eb 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1531,3 +1531,13 @@ export class FunctionBreakpoint extends Breakpoint { this.functionName = functionName; } } + +export enum LogLevel { + Trace = 1, + Debug = 2, + Info = 3, + Warning = 4, + Error = 5, + Critical = 6, + Off = 7 +} diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index 952ef7e4f96..122a62f3277 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -98,7 +98,7 @@ export class ExtensionHostMain { this._logService.trace('initData', initData); this._extHostConfiguration = new ExtHostConfiguration(threadService.get(MainContext.MainThreadConfiguration), extHostWorkspace, initData.configuration); - this._extensionService = new ExtHostExtensionService(initData, threadService, extHostWorkspace, this._extHostConfiguration, this._logService); + this._extensionService = new ExtHostExtensionService(initData, threadService, extHostWorkspace, this._extHostConfiguration, this._logService, environmentService); // error forwarding and stack trace scanning const extensionErrors = new WeakMap(); From b3fde70cb49072334d6db70262b168a2d86f2c7c Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 12 Dec 2017 19:23:24 -0800 Subject: [PATCH 2/5] Move extension logger to extension context --- src/vs/vscode.d.ts | 12 +++++------- src/vs/workbench/api/node/extHost.api.impl.ts | 7 +------ .../workbench/api/node/extHostExtensionActivator.ts | 2 ++ src/vs/workbench/api/node/extHostExtensionService.ts | 9 +++++++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 65354174c44..4b45a1d37c9 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3930,6 +3930,11 @@ declare module 'vscode' { * [`globalState`](#ExtensionContext.globalState) to store key value data. */ storagePath: string | undefined; + + /** + * A logger + */ + logger: ILogger; } /** @@ -4388,13 +4393,6 @@ declare module 'vscode' { * @readonly */ export let sessionId: string; - - /** - * Something - * - * @readonly - */ - export let logger: ILogger; } /** diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 6c3cdb9f832..4647ecd9814 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -59,8 +59,6 @@ import { toGlobPattern, toLanguageSelector } from 'vs/workbench/api/node/extHost import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; -import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; export interface IExtensionApiFactory { (extension: IExtensionDescription): typeof vscode; @@ -85,8 +83,7 @@ export function createApiFactory( extHostWorkspace: ExtHostWorkspace, extHostConfiguration: ExtHostConfiguration, extensionService: ExtHostExtensionService, - logService: ILogService, - environmentService: IEnvironmentService + logService: ILogService ): IExtensionApiFactory { // Addressable instances @@ -124,7 +121,6 @@ export function createApiFactory( const extHostProgress = new ExtHostProgress(threadService.get(MainContext.MainThreadProgress)); const extHostOutputService = new ExtHostOutputService(threadService); const extHostLanguages = new ExtHostLanguages(threadService); - const extHostLogService = new ExtHostLogService(environmentService); // Register API-ish commands ExtHostApiCommands.register(extHostCommands); @@ -206,7 +202,6 @@ export function createApiFactory( get language() { return Platform.language; }, get appName() { return product.nameLong; }, get appRoot() { return initData.environment.appRoot; }, - get logger() { return extHostLogService.getExtLogger(extension.id); }, }); // namespace: extensions diff --git a/src/vs/workbench/api/node/extHostExtensionActivator.ts b/src/vs/workbench/api/node/extHostExtensionActivator.ts index 5038d467d3b..b0949051e4f 100644 --- a/src/vs/workbench/api/node/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/node/extHostExtensionActivator.ts @@ -10,6 +10,7 @@ import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtHostLogger } from 'vs/workbench/api/node/extHostLogService'; const hasOwnProperty = Object.hasOwnProperty; const NO_OP_VOID_PROMISE = TPromise.wrap(void 0); @@ -26,6 +27,7 @@ export interface IExtensionContext { extensionPath: string; storagePath: string; asAbsolutePath(relativePath: string): string; + logger: ExtHostLogger; } /** diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 321b24b8f2b..92f57ca8706 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -22,6 +22,7 @@ import { TernarySearchTree } from 'vs/base/common/map'; import { Barrier } from 'vs/base/common/async'; import { ILogService } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; class ExtensionMemento implements IExtensionMemento { @@ -119,6 +120,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private readonly _storagePath: ExtensionStoragePath; private readonly _proxy: MainThreadExtensionServiceShape; private readonly _logService: ILogService; + private readonly _extHostLogService: ExtHostLogService; private _activator: ExtensionsActivator; private _extensionPathIndex: TPromise>; /** @@ -140,9 +142,10 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._storagePath = new ExtensionStoragePath(initData.workspace, initData.environment); this._proxy = this._threadService.get(MainContext.MainThreadExtensionService); this._activator = null; + this._extHostLogService = new ExtHostLogService(environmentService); // initialize API first (i.e. do not release barrier until the API is initialized) - const apiFactory = createApiFactory(initData, threadService, extHostWorkspace, extHostConfiguration, this, logService, environmentService); + const apiFactory = createApiFactory(initData, threadService, extHostWorkspace, extHostConfiguration, this, logService); initializeExtensionApi(this, apiFactory).then(() => { @@ -334,13 +337,15 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { workspaceState.whenReady, this._storagePath.whenReady ]).then(() => { + const that = this; return Object.freeze({ globalState, workspaceState, subscriptions: [], get extensionPath() { return extensionDescription.extensionFolderPath; }, storagePath: this._storagePath.value(extensionDescription), - asAbsolutePath: (relativePath: string) => { return join(extensionDescription.extensionFolderPath, relativePath); } + asAbsolutePath: (relativePath: string) => { return join(extensionDescription.extensionFolderPath, relativePath); }, + get logger() { return that._extHostLogService.getExtLogger(extensionDescription.id); } }); }); } From d279e2de6cd2ac43b88ba1025cd62ca300c4c133 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 13 Dec 2017 14:02:27 -0800 Subject: [PATCH 3/5] Make logger API proposed, add jsdoc, and match some extension API conventions better --- src/vs/vscode.d.ts | 28 --------------- src/vs/vscode.proposed.d.ts | 36 +++++++++++++++++++ .../workbench/api/node/extHostLogService.ts | 9 +++-- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4b45a1d37c9..86982258339 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3930,11 +3930,6 @@ declare module 'vscode' { * [`globalState`](#ExtensionContext.globalState) to store key value data. */ storagePath: string | undefined; - - /** - * A logger - */ - logger: ILogger; } /** @@ -4330,29 +4325,6 @@ declare module 'vscode' { resolveTask(task: Task, token?: CancellationToken): ProviderResult; } - export enum LogLevel { - Trace = 1, - Debug = 2, - Info = 3, - Warning = 4, - Error = 5, - Critical = 6, - Off = 7 - } - - export interface ILogger { - onDidChangeLogLevel: Event; - getLevel(): LogLevel; - getLogDirectory(): Thenable; - - trace(message: string, ...args: any[]): void; - debug(message: string, ...args: any[]): void; - info(message: string, ...args: any[]): void; - warn(message: string, ...args: any[]): void; - error(message: string | Error, ...args: any[]): void; - critical(message: string | Error, ...args: any[]): void; - } - /** * Namespace describing the environment the editor runs in. */ diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 566fc38c017..faf05d3ed20 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -326,4 +326,40 @@ declare module 'vscode' { private constructor(enabled: boolean, condition: string, hitCondition: string, functionName: string); } + + /** + * The severity level of a log message + */ + export enum LogLevel { + Trace = 1, + Debug = 2, + Info = 3, + Warning = 4, + Error = 5, + Critical = 6, + Off = 7 + } + + /** + * A logger for writing to an extension's log file, and accessing its dedicated log directory. + */ + export interface Logger { + onDidChangeLogLevel: Event; + readonly currentLevel: LogLevel; + getLogDirectory(): Thenable; + + trace(message: string, ...args: any[]): void; + debug(message: string, ...args: any[]): void; + info(message: string, ...args: any[]): void; + warn(message: string, ...args: any[]): void; + error(message: string | Error, ...args: any[]): void; + critical(message: string | Error, ...args: any[]): void; + } + + export interface ExtensionContext { + /** + * A logger + */ + logger: Logger; + } } diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts index 347dc8c6be0..a1d017c31b3 100644 --- a/src/vs/workbench/api/node/extHostLogService.ts +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -40,19 +40,22 @@ export class ExtHostLogService implements ExtHostLogServiceShape { } } -export class ExtHostLogger implements vscode.ILogger { +export class ExtHostLogger implements vscode.Logger { private _currentLevel: LogLevel; - get onDidChangeLogLevel(): Event { return this._extHostLogService.onDidChangeLogLevel; } - constructor( private readonly _extHostLogService: ExtHostLogService, private readonly _logService: ILogService, private readonly _logDirectory: string ) { + this._currentLevel = this._logService.getLevel(); this._extHostLogService.onDidChangeLogLevel(logLevel => this._currentLevel = logLevel); } + get onDidChangeLogLevel(): Event { return this._extHostLogService.onDidChangeLogLevel; } + + get currentLevel(): LogLevel { return this._currentLevel; } + getLogDirectory(): TPromise { return dirExists(this._logDirectory).then(exists => { if (exists) { From 35c7351761770bfd6580bc2826510ba67343e973 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 13 Dec 2017 14:16:00 -0800 Subject: [PATCH 4/5] More ExtHostLogger tweaks, and remove logLevel syncing code, for real investigation later --- src/vs/vscode.proposed.d.ts | 4 +-- src/vs/workbench/api/node/extHost.protocol.ts | 6 +--- .../workbench/api/node/extHostLogService.ts | 29 +++++++------------ 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index faf05d3ed20..ffa7d157c45 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -344,9 +344,9 @@ declare module 'vscode' { * A logger for writing to an extension's log file, and accessing its dedicated log directory. */ export interface Logger { - onDidChangeLogLevel: Event; + readonly onDidChangeLogLevel: Event; readonly currentLevel: LogLevel; - getLogDirectory(): Thenable; + readonly logDirectory: Thenable; trace(message: string, ...args: any[]): void; debug(message: string, ...args: any[]): void; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 67091188abb..db31f504d0e 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -33,7 +33,7 @@ import { IConfigurationData, ConfigurationTarget, IConfigurationModel } from 'vs import { IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; -import { EndOfLine, TextEditorLineNumbersStyle, LogLevel } from 'vs/workbench/api/node/extHostTypes'; +import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; import { TaskSet } from 'vs/workbench/parts/tasks/common/tasks'; @@ -673,10 +673,6 @@ export interface ExtHostWindowShape { $onDidChangeWindowFocus(value: boolean): void; } -export interface ExtHostLogServiceShape { - $acceptLogLevelChanged(logLevel: LogLevel): void; -} - // --- proxy identifiers export const MainContext = { diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts index a1d017c31b3..150bde4af3d 100644 --- a/src/vs/workbench/api/node/extHostLogService.ts +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -9,31 +9,23 @@ import * as vscode from 'vscode'; import { TPromise } from 'vs/base/common/winjs.base'; import { mkdirp, dirExists } from 'vs/base/node/pfs'; import Event, { Emitter } from 'vs/base/common/event'; -import { ExtHostLogServiceShape } from './extHost.protocol'; import { LogLevel } from 'vs/workbench/api/node/extHostTypes'; import { ILogService } from 'vs/platform/log/common/log'; import { createLogService } from 'vs/platform/log/node/spdlogService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { memoize } from 'vs/base/common/decorators'; -export class ExtHostLogService implements ExtHostLogServiceShape { +export class ExtHostLogService { private _loggers: Map = new Map(); - private _onDidChangeLogLevel: Emitter; - get onDidChangeLogLevel(): Event { return this._onDidChangeLogLevel.event; } - constructor(private _environmentService: IEnvironmentService) { - this._onDidChangeLogLevel = new Emitter(); - } - - $acceptLogLevelChanged(logLevel: LogLevel): void { - this._onDidChangeLogLevel.fire(logLevel); } getExtLogger(extensionID: string): ExtHostLogger { if (!this._loggers.has(extensionID)) { const logService = createLogService(extensionID, this._environmentService, extensionID); const logsDirPath = path.join(this._environmentService.logsPath, extensionID); - this._loggers.set(extensionID, new ExtHostLogger(this, logService, logsDirPath)); + this._loggers.set(extensionID, new ExtHostLogger(logService, logsDirPath)); } return this._loggers.get(extensionID); @@ -42,21 +34,24 @@ export class ExtHostLogService implements ExtHostLogServiceShape { export class ExtHostLogger implements vscode.Logger { private _currentLevel: LogLevel; + private _onDidChangeLogLevel: Emitter; constructor( - private readonly _extHostLogService: ExtHostLogService, private readonly _logService: ILogService, private readonly _logDirectory: string ) { this._currentLevel = this._logService.getLevel(); - this._extHostLogService.onDidChangeLogLevel(logLevel => this._currentLevel = logLevel); + this._onDidChangeLogLevel = new Emitter(); + this.onDidChangeLogLevel = this._onDidChangeLogLevel.event; } - get onDidChangeLogLevel(): Event { return this._extHostLogService.onDidChangeLogLevel; } + // TODO + readonly onDidChangeLogLevel: Event; get currentLevel(): LogLevel { return this._currentLevel; } - getLogDirectory(): TPromise { + @memoize + get logDirectory(): TPromise { return dirExists(this._logDirectory).then(exists => { if (exists) { return TPromise.wrap(null); @@ -68,10 +63,6 @@ export class ExtHostLogger implements vscode.Logger { }); } - getLevel(): vscode.LogLevel { - return this._currentLevel; - } - trace(message: string, ...args: any[]): void { return this._logService.trace(message, ...args); } From 206b62db8d7adbbe0806b8d18d1aae8758b1608b Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 14 Dec 2017 16:11:12 -0800 Subject: [PATCH 5/5] Slightly better "logger" comment --- src/vs/vscode.proposed.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 6f099f90b0d..7fe3e931dd6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -367,7 +367,7 @@ declare module 'vscode' { export interface ExtensionContext { /** - * A logger + * This extension's logger */ logger: Logger; }