diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 7c10f6b6b568c96ad0e398d059f340934f45db0e..3de4a7af9dda9e3e523ba4b5774f1667d66b0b9b 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -434,7 +434,23 @@ declare module 'vscode' { Off = 7 } + /** + * A logger for writing to an extension's log file, and accessing its dedicated log directory. + */ + export interface Logger { + 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 { + /** + * This extension's logger + */ + logger: Logger; /** * Path where an extension can write log files. diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index a8afbaabb36ed28d9119b99e9f632d6e16c823ae..ea64898c5b15cfae4b4ab32d722f4ae4a68f831a 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -227,10 +227,7 @@ export function createApiFactory( get language() { return platform.language; }, get appName() { return product.nameLong; }, get appRoot() { return initData.environment.appRoot; }, - get logLevel() { - checkProposedApiEnabled(extension); - return extHostLogService.getLevel(); - } + get logLevel() { return extHostLogService.getLevel(); } }); // namespace: extensions diff --git a/src/vs/workbench/api/node/extHostExtensionActivator.ts b/src/vs/workbench/api/node/extHostExtensionActivator.ts index b392d0182f17af75e30732d2886d0448bbe700ae..cbd8a70d649656ffc11fd1521d1f5665f65f91be 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/workbench/services/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; readonly logDirectory: string; readonly logPath: string; } diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 06c5226302298b8bf998f06b6cf7228a34ec3fe9..f29e288412bd6ae36a7e219b0970a838aeafdb9b 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -361,6 +361,10 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { get extensionPath() { return extensionDescription.extensionLocation.fsPath; }, storagePath: this._storagePath.value(extensionDescription), asAbsolutePath: (relativePath: string) => { return join(extensionDescription.extensionLocation.fsPath, relativePath); }, + get logger() { + checkProposedApiEnabled(extensionDescription); + return that._extHostLogService.getExtLogger(extensionDescription.id); + }, get logDirectory() { console.warn(`this PROPOSED API has been RENAMED to 'logPath'`); checkProposedApiEnabled(extensionDescription); diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts index 31b0113188f95d278b2182ee059a2f0520ba3ae0..6708690a2f429011e078526a9470002b6d5aad3f 100644 --- a/src/vs/workbench/api/node/extHostLogService.ts +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import * as vscode from 'vscode'; import { join } from 'vs/base/common/paths'; import { LogLevel } from 'vs/workbench/api/node/extHostTypes'; import { ILogService, DelegatedLogService } from 'vs/platform/log/common/log'; @@ -13,6 +14,8 @@ import { ExtHostLogServiceShape } from 'vs/workbench/api/node/extHost.protocol'; export class ExtHostLogService extends DelegatedLogService implements ILogService, ExtHostLogServiceShape { + private _loggers: Map = new Map(); + constructor( private _windowId: number, logLevel: LogLevel, @@ -25,7 +28,54 @@ export class ExtHostLogService extends DelegatedLogService implements ILogServic this.setLevel(level); } + getExtLogger(extensionID: string): ExtHostLogger { + let logger = this._loggers.get(extensionID); + if (!logger) { + logger = this.createLogger(extensionID); + this._loggers.set(extensionID, logger); + } + return logger; + } + getLogDirectory(extensionID: string): string { return join(this._logsPath, `${extensionID}_${this._windowId}`); } + + private createLogger(extensionID: string): ExtHostLogger { + const logsDirPath = this.getLogDirectory(extensionID); + const logService = createSpdLogService(extensionID, this.getLevel(), logsDirPath); + this._register(this.onDidChangeLogLevel(level => logService.setLevel(level))); + return new ExtHostLogger(logService); + } +} + +export class ExtHostLogger implements vscode.Logger { + + constructor( + private readonly _logService: ILogService + ) { } + + 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); + } }