Skip to content

Commit 810efbc

Browse files
committed
- Remove windowId from IInitData
- Send exthost logs location from renderer - IExtensionService: Expose an API to get exthost logs location
1 parent 8d0c573 commit 810efbc

10 files changed

Lines changed: 66 additions & 46 deletions

File tree

src/vs/workbench/api/node/extHost.api.impl.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ export function createApiFactory(
138138
const extHostMessageService = new ExtHostMessageService(rpcProtocol);
139139
const extHostDialogs = new ExtHostDialogs(rpcProtocol);
140140
const extHostStatusBar = new ExtHostStatusBar(rpcProtocol);
141-
const outputDir = posix.join(initData.logsPath, `output_logging_${initData.windowId}_${toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')}`);
142-
const extHostOutputService = new ExtHostOutputService(outputDir, rpcProtocol);
141+
const outputPath = posix.join(initData.logsLocation.fsPath, `output_logging_${toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')}`);
142+
const extHostOutputService = new ExtHostOutputService(outputPath, rpcProtocol);
143143
const extHostLanguages = new ExtHostLanguages(rpcProtocol);
144144

145145
// Register API-ish commands

src/vs/workbench/api/node/extHost.protocol.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ export interface IInitData {
6666
extensions: IExtensionDescription[];
6767
configuration: IConfigurationInitData;
6868
telemetryInfo: ITelemetryInfo;
69-
windowId: number;
7069
logLevel: LogLevel;
71-
logsPath: string;
70+
logsLocation: URI;
7271
}
7372

7473
export interface IConfigurationInitData extends IConfigurationData {

src/vs/workbench/api/node/extHostLogService.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,26 @@ import { LogLevel } from 'vs/workbench/api/node/extHostTypes';
99
import { ILogService, DelegatedLogService } from 'vs/platform/log/common/log';
1010
import { createSpdLogService } from 'vs/platform/log/node/spdlogService';
1111
import { ExtHostLogServiceShape } from 'vs/workbench/api/node/extHost.protocol';
12+
import { ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions';
1213

1314

1415
export class ExtHostLogService extends DelegatedLogService implements ILogService, ExtHostLogServiceShape {
1516

17+
private _logsPath: string;
18+
1619
constructor(
17-
private _windowId: number,
1820
logLevel: LogLevel,
19-
private _logsPath: string
21+
logsPath: string,
2022
) {
21-
super(createSpdLogService(`exthost${_windowId}`, logLevel, _logsPath));
23+
super(createSpdLogService(ExtensionHostLogFileName, logLevel, logsPath));
24+
this._logsPath = logsPath;
2225
}
2326

2427
$setLevel(level: LogLevel): void {
2528
this.setLevel(level);
2629
}
2730

2831
getLogDirectory(extensionID: string): string {
29-
return join(this._logsPath, `${extensionID}_${this._windowId}`);
32+
return join(this._logsPath, extensionID);
3033
}
3134
}

src/vs/workbench/node/extensionHostMain.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,9 @@ export class ExtensionHostMain {
100100
this._workspace = rpcProtocol.transformIncomingURIs(initData.workspace);
101101
// ensure URIs are revived
102102
initData.extensions.forEach((ext) => (<any>ext).extensionLocation = URI.revive(ext.extensionLocation));
103+
initData.logsLocation = URI.revive(initData.logsLocation);
103104

104-
this._extHostLogService = new ExtHostLogService(initData.windowId, initData.logLevel, initData.logsPath);
105+
this._extHostLogService = new ExtHostLogService(initData.logLevel, initData.logsLocation.fsPath);
105106
this.disposables.push(this._extHostLogService);
106107

107108
this._searchRequestIdProvider = new Counter();

src/vs/workbench/parts/logs/electron-browser/logs.contribution.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import * as nls from 'vs/nls';
77
import { join } from 'vs/base/common/paths';
8+
import * as resources from 'vs/base/common/resources';
89
import { Registry } from 'vs/platform/registry/common/platform';
910
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions';
1011
import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/parts/output/common/output';
@@ -13,26 +14,26 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment'
1314
import { IWindowService } from 'vs/platform/windows/common/windows';
1415
import { Disposable } from 'vs/base/common/lifecycle';
1516
import { URI } from 'vs/base/common/uri';
16-
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1717
import * as Constants from 'vs/workbench/parts/logs/common/logConstants';
1818
import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions';
1919
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
2020
import { ShowLogsAction, OpenLogsFolderAction, SetLogLevelAction, OpenLogFileAction } from 'vs/workbench/parts/logs/electron-browser/logsActions';
21+
import { IExtensionService, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions';
2122

2223

2324
class LogOutputChannels extends Disposable implements IWorkbenchContribution {
2425

2526
constructor(
26-
@IWindowService private windowService: IWindowService,
27-
@IEnvironmentService private environmentService: IEnvironmentService,
28-
@IInstantiationService instantiationService: IInstantiationService
27+
@IWindowService windowService: IWindowService,
28+
@IEnvironmentService environmentService: IEnvironmentService,
29+
@IExtensionService extensionService: IExtensionService
2930
) {
3031
super();
3132
let outputChannelRegistry = Registry.as<IOutputChannelRegistry>(OutputExt.OutputChannels);
32-
outputChannelRegistry.registerChannel({ id: Constants.mainLogChannelId, label: nls.localize('mainLog', "Log (Main)"), file: URI.file(join(this.environmentService.logsPath, `main.log`)), log: true });
33-
outputChannelRegistry.registerChannel({ id: Constants.sharedLogChannelId, label: nls.localize('sharedLog', "Log (Shared)"), file: URI.file(join(this.environmentService.logsPath, `sharedprocess.log`)), log: true });
34-
outputChannelRegistry.registerChannel({ id: Constants.rendererLogChannelId, label: nls.localize('rendererLog', "Log (Window)"), file: URI.file(join(this.environmentService.logsPath, `renderer${this.windowService.getCurrentWindowId()}.log`)), log: true });
35-
outputChannelRegistry.registerChannel({ id: Constants.extHostLogChannelId, label: nls.localize('extensionsLog', "Log (Extension Host)"), file: URI.file(join(this.environmentService.logsPath, `exthost${this.windowService.getCurrentWindowId()}.log`)), log: true });
33+
outputChannelRegistry.registerChannel({ id: Constants.mainLogChannelId, label: nls.localize('mainLog', "Log (Main)"), file: URI.file(join(environmentService.logsPath, `main.log`)), log: true });
34+
outputChannelRegistry.registerChannel({ id: Constants.sharedLogChannelId, label: nls.localize('sharedLog', "Log (Shared)"), file: URI.file(join(environmentService.logsPath, `sharedprocess.log`)), log: true });
35+
outputChannelRegistry.registerChannel({ id: Constants.rendererLogChannelId, label: nls.localize('rendererLog', "Log (Window)"), file: URI.file(join(environmentService.logsPath, `renderer${windowService.getCurrentWindowId()}.log`)), log: true });
36+
extensionService.getLogsLocations().then(([logsLocation]) => outputChannelRegistry.registerChannel({ id: Constants.extHostLogChannelId, label: nls.localize('extensionsLog', "Log (Extension Host)"), file: resources.joinPath(logsLocation, `${ExtensionHostLogFileName}.log`), log: true }));
3637

3738
const workbenchActionsRegistry = Registry.as<IWorkbenchActionRegistry>(WorkbenchActionExtensions.WorkbenchActions);
3839
const devCategory = nls.localize('developer', "Developer");

src/vs/workbench/services/commands/test/common/commandService.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { InstantiationService } from 'vs/platform/instantiation/common/instantia
1414
import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry';
1515
import { Event, Emitter } from 'vs/base/common/event';
1616
import { NullLogService } from 'vs/platform/log/common/log';
17+
import { URI } from 'vs/base/common/uri';
1718

1819
class SimpleExtensionService implements IExtensionService {
1920
_serviceBrand: any;
@@ -37,6 +38,7 @@ class SimpleExtensionService implements IExtensionService {
3738
getExtensions(): TPromise<IExtensionDescription[]> {
3839
return TPromise.wrap([]);
3940
}
41+
getLogsLocations(): TPromise<URI[]> { return TPromise.as([]); }
4042
canProfileExtensionHost() {
4143
return false;
4244
}

src/vs/workbench/services/extensions/common/extensions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ export class ExtensionPointContribution<T> {
116116
}
117117
}
118118

119+
export const ExtensionHostLogFileName = 'exthost';
120+
119121
export interface IExtensionService {
120122
_serviceBrand: any;
121123

@@ -151,6 +153,11 @@ export interface IExtensionService {
151153
*/
152154
getExtensions(): TPromise<IExtensionDescription[]>;
153155

156+
/**
157+
* Return extension host log folder paths
158+
*/
159+
getLogsLocations(): TPromise<URI[]>;
160+
154161
/**
155162
* Read all contributions to an extension point.
156163
*/

src/vs/workbench/services/extensions/electron-browser/extensionHost.ts

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
7474

7575
constructor(
7676
private readonly _extensions: TPromise<IExtensionDescription[]>,
77+
private readonly _logsLocation: TPromise<URI>,
7778
@IWorkspaceContextService private readonly _contextService: IWorkspaceContextService,
7879
@INotificationService private readonly _notificationService: INotificationService,
7980
@IWindowsService private readonly _windowsService: IWindowsService,
@@ -375,34 +376,35 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
375376
}
376377

377378
private _createExtHostInitData(): TPromise<IInitData> {
378-
return TPromise.join([this._telemetryService.getTelemetryInfo(), this._extensions]).then(([telemetryInfo, extensionDescriptions]) => {
379-
const configurationData: IConfigurationInitData = { ...this._configurationService.getConfigurationData(), configurationScopes: {} };
380-
const workspace = this._contextService.getWorkspace();
381-
const r: IInitData = {
382-
parentPid: process.pid,
383-
environment: {
384-
isExtensionDevelopmentDebug: this._isExtensionDevDebug,
385-
appRoot: this._environmentService.appRoot,
386-
appSettingsHome: this._environmentService.appSettingsHome,
387-
extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI,
388-
extensionTestsPath: this._environmentService.extensionTestsPath
389-
},
390-
workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : {
391-
configuration: workspace.configuration,
392-
folders: workspace.folders,
393-
id: workspace.id,
394-
name: this._labelService.getWorkspaceLabel(workspace)
395-
},
396-
extensions: extensionDescriptions,
397-
// Send configurations scopes only in development mode.
398-
configuration: !this._environmentService.isBuilt || this._environmentService.isExtensionDevelopment ? { ...configurationData, configurationScopes: getScopes() } : configurationData,
399-
telemetryInfo,
400-
windowId: this._windowService.getCurrentWindowId(),
401-
logLevel: this._logService.getLevel(),
402-
logsPath: this._environmentService.logsPath
403-
};
404-
return r;
405-
});
379+
const promises: TPromise[] = [this._telemetryService.getTelemetryInfo(), this._extensions, this._logsLocation];
380+
return TPromise.join(promises)
381+
.then(([telemetryInfo, extensionDescriptions, logsLocation]) => {
382+
const configurationData: IConfigurationInitData = { ...this._configurationService.getConfigurationData(), configurationScopes: {} };
383+
const workspace = this._contextService.getWorkspace();
384+
const r: IInitData = {
385+
parentPid: process.pid,
386+
environment: {
387+
isExtensionDevelopmentDebug: this._isExtensionDevDebug,
388+
appRoot: this._environmentService.appRoot,
389+
appSettingsHome: this._environmentService.appSettingsHome,
390+
extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI,
391+
extensionTestsPath: this._environmentService.extensionTestsPath
392+
},
393+
workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : {
394+
configuration: workspace.configuration,
395+
folders: workspace.folders,
396+
id: workspace.id,
397+
name: this._labelService.getWorkspaceLabel(workspace)
398+
},
399+
extensions: extensionDescriptions,
400+
// Send configurations scopes only in development mode.
401+
configuration: !this._environmentService.isBuilt || this._environmentService.isExtensionDevelopment ? { ...configurationData, configurationScopes: getScopes() } : configurationData,
402+
telemetryInfo,
403+
logLevel: this._logService.getLevel(),
404+
logsLocation
405+
};
406+
return r;
407+
});
406408
}
407409

408410
private _logExtensionHostMessage(entry: IRemoteConsoleLog) {

src/vs/workbench/services/extensions/electron-browser/extensionService.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ export class ExtensionService extends Disposable implements IExtensionService {
368368
private _startExtensionHostProcess(initialActivationEvents: string[]): void {
369369
this._stopExtensionHostProcess();
370370

371-
const extHostProcessWorker = this._instantiationService.createInstance(ExtensionHostProcessWorker, this.getExtensions());
371+
const extHostProcessWorker = this._instantiationService.createInstance(ExtensionHostProcessWorker, this.getExtensions(), this.getLogsLocations().then(([logsLocation]) => logsLocation));
372372
const extHostProcessManager = this._instantiationService.createInstance(ExtensionHostProcessManager, extHostProcessWorker, initialActivationEvents);
373373
extHostProcessManager.onDidCrash(([code, signal]) => this._onExtensionHostCrashed(code, signal));
374374
this._extensionHostProcessManagers.push(extHostProcessManager);
@@ -436,6 +436,10 @@ export class ExtensionService extends Disposable implements IExtensionService {
436436
});
437437
}
438438

439+
public getLogsLocations(): TPromise<URI[]> {
440+
return TPromise.as([URI.file(path.posix.join(this._environmentService.logsPath, `exthost${this._windowService.getCurrentWindowId()}`))]);
441+
}
442+
439443
public readExtensionPointContributions<T>(extPoint: IExtensionPoint<T>): TPromise<ExtensionPointContribution<T>[]> {
440444
return this._installedExtensionsReady.wait().then(() => {
441445
let availableExtensions = this._registry.getAllExtensionDescriptions();

src/vs/workbench/test/workbenchTestServices.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ export class TestExtensionService implements IExtensionService {
307307
activateByEvent(activationEvent: string): TPromise<void> { return TPromise.as(void 0); }
308308
whenInstalledExtensionsRegistered(): TPromise<boolean> { return TPromise.as(true); }
309309
getExtensions(): TPromise<IExtensionDescription[]> { return TPromise.as([]); }
310+
getLogsLocations(): TPromise<URI[]> { return TPromise.as([]); }
310311
readExtensionPointContributions<T>(extPoint: IExtensionPoint<T>): TPromise<ExtensionPointContribution<T>[]> { return TPromise.as(Object.create(null)); }
311312
getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { return Object.create(null); }
312313
canProfileExtensionHost(): boolean { return false; }

0 commit comments

Comments
 (0)