Skip to content

Commit c9b2919

Browse files
committed
microsoft#39574 Implement log level transmission to extension host
1 parent f2b303f commit c9b2919

8 files changed

Lines changed: 53 additions & 41 deletions

File tree

src/vs/platform/log/common/log.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,20 +239,19 @@ export class MultiplexLogService extends AbstractLogService implements ILogServi
239239
}
240240
}
241241

242-
export class FollowerLogService extends Disposable implements ILogService {
242+
export class DelegatedLogService extends Disposable implements ILogService {
243243
_serviceBrand: any;
244244

245-
constructor(private master: ILogLevelSetter, private logService: ILogService) {
245+
constructor(private logService: ILogService) {
246246
super();
247-
this._register(master.onDidChangeLogLevel(level => logService.setLevel(level)));
248247
}
249248

250249
get onDidChangeLogLevel(): Event<LogLevel> {
251250
return this.logService.onDidChangeLogLevel;
252251
}
253252

254253
setLevel(level: LogLevel): void {
255-
this.master.setLevel(level);
254+
this.logService.setLevel(level);
256255
}
257256

258257
getLevel(): LogLevel {
@@ -288,6 +287,19 @@ export class FollowerLogService extends Disposable implements ILogService {
288287
}
289288
}
290289

290+
export class FollowerLogService extends DelegatedLogService implements ILogService {
291+
_serviceBrand: any;
292+
293+
constructor(private master: ILogLevelSetter, logService: ILogService) {
294+
super(logService);
295+
this._register(master.onDidChangeLogLevel(level => logService.setLevel(level)));
296+
}
297+
298+
setLevel(level: LogLevel): void {
299+
this.master.setLevel(level);
300+
}
301+
}
302+
291303
export class NullLogService implements ILogService {
292304
_serviceBrand: any;
293305
readonly onDidChangeLogLevel: Event<LogLevel> = new Emitter<LogLevel>().event;

src/vs/workbench/api/electron-browser/extensionHost.contribution.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import './mainThreadTask';
4646
import './mainThreadTelemetry';
4747
import './mainThreadTerminalService';
4848
import './mainThreadTreeViews';
49+
import './mainThreadLogService';
4950
import './mainThreadWindow';
5051
import './mainThreadWorkspace';
5152

src/vs/workbench/api/electron-browser/mainThreadLogService.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,20 @@
55

66
'use strict';
77

8-
import { IExtHostContext } from '../node/extHost.protocol';
98
import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
109
import { ILogService } from 'vs/platform/log/common/log';
1110
import { Disposable } from 'vs/base/common/lifecycle';
11+
import { IExtHostContext, ExtHostContext } from 'vs/workbench/api/node/extHost.protocol';
1212

1313
@extHostCustomer
14-
export class MainThreadLogLevelManagementChannel extends Disposable {
14+
export class MainThreadLogService extends Disposable {
1515

1616
constructor(
1717
extHostContext: IExtHostContext,
1818
@ILogService logService: ILogService,
1919
) {
2020
super();
21-
// this._register(logService.onDidChangeLogLevel(level => extHostContext.getProxy(ExtHostContext.ExtHostLogService).$setLogLevel(level)));
21+
this._register(logService.onDidChangeLogLevel(level => extHostContext.getProxy(ExtHostContext.ExtHostLogService).$setLevel(level)));
2222
}
2323

2424
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ import { ExtHostDecorations } from 'vs/workbench/api/node/extHostDecorations';
5555
import { toGlobPattern, toLanguageSelector } from 'vs/workbench/api/node/extHostTypeConverters';
5656
import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator';
5757
import { isFalsyOrEmpty } from 'vs/base/common/arrays';
58-
import { ILogService } from 'vs/platform/log/common/log';
5958
import { OverviewRulerLane } from 'vs/editor/common/model';
59+
import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService';
6060

6161
export interface IExtensionApiFactory {
6262
(extension: IExtensionDescription): typeof vscode;
@@ -89,18 +89,19 @@ export function createApiFactory(
8989
extHostWorkspace: ExtHostWorkspace,
9090
extHostConfiguration: ExtHostConfiguration,
9191
extensionService: ExtHostExtensionService,
92-
logService: ILogService
92+
extHostLogService: ExtHostLogService
9393
): IExtensionApiFactory {
9494

9595
// Addressable instances
96+
rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService);
9697
const extHostHeapService = rpcProtocol.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService());
9798
const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol));
9899
const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol));
99100
const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors));
100101
const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors));
101-
const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(logService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadEditors)));
102+
const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadEditors)));
102103
const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors));
103-
const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostHeapService, logService));
104+
const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostHeapService, extHostLogService));
104105
const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands));
105106
rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace);
106107
const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(rpcProtocol, extHostWorkspace));
@@ -111,7 +112,7 @@ export function createApiFactory(
111112
const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService());
112113
const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands));
113114
const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol));
114-
const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, logService));
115+
const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService));
115116
const extHostTask = rpcProtocol.set(ExtHostContext.ExtHostTask, new ExtHostTask(rpcProtocol, extHostWorkspace));
116117
const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol));
117118
rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ export interface ExtHostWindowShape {
746746
}
747747

748748
export interface ExtHostLogServiceShape {
749-
$setLogLevel(level: LogLevel);
749+
$setLevel(level: LogLevel);
750750
}
751751

752752
// --- proxy identifiers
@@ -799,7 +799,7 @@ export const ExtHostContext = {
799799
ExtHostLanguageFeatures: createExtId<ExtHostLanguageFeaturesShape>('ExtHostLanguageFeatures'),
800800
ExtHostQuickOpen: createExtId<ExtHostQuickOpenShape>('ExtHostQuickOpen'),
801801
ExtHostExtensionService: createExtId<ExtHostExtensionServiceShape>('ExtHostExtensionService'),
802-
// ExtHostLogService: createExtId<ExtHostLogServiceShape>('ExtHostLogService'),
802+
ExtHostLogService: createExtId<ExtHostLogServiceShape>('ExtHostLogService'),
803803
ExtHostTerminalService: createExtId<ExtHostTerminalServiceShape>('ExtHostTerminalService'),
804804
ExtHostSCM: createExtId<ExtHostSCMShape>('ExtHostSCM'),
805805
ExtHostTask: createExtId<ExtHostTaskShape>('ExtHostTask', ProxyType.CustomMarshaller),

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
128128
private readonly _storage: ExtHostStorage;
129129
private readonly _storagePath: ExtensionStoragePath;
130130
private readonly _proxy: MainThreadExtensionServiceShape;
131-
private readonly _logService: ILogService;
132131
private readonly _extHostLogService: ExtHostLogService;
133132
private _activator: ExtensionsActivator;
134133
private _extensionPathIndex: TPromise<TernarySearchTree<IExtensionDescription>>;
@@ -139,21 +138,20 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
139138
extHostContext: IExtHostContext,
140139
extHostWorkspace: ExtHostWorkspace,
141140
extHostConfiguration: ExtHostConfiguration,
142-
logService: ILogService,
141+
extHostLogService: ExtHostLogService,
143142
environmentService: IEnvironmentService
144143
) {
145144
this._barrier = new Barrier();
146145
this._registry = new ExtensionDescriptionRegistry(initData.extensions);
147-
this._logService = logService;
146+
this._extHostLogService = extHostLogService;
148147
this._mainThreadTelemetry = extHostContext.getProxy(MainContext.MainThreadTelemetry);
149148
this._storage = new ExtHostStorage(extHostContext);
150149
this._storagePath = new ExtensionStoragePath(initData.workspace, initData.environment);
151150
this._proxy = extHostContext.getProxy(MainContext.MainThreadExtensionService);
152151
this._activator = null;
153-
this._extHostLogService = new ExtHostLogService(environmentService, this._logService);
154152

155153
// initialize API first (i.e. do not release barrier until the API is initialized)
156-
const apiFactory = createApiFactory(initData, extHostContext, extHostWorkspace, extHostConfiguration, this, logService);
154+
const apiFactory = createApiFactory(initData, extHostContext, extHostWorkspace, extHostConfiguration, this, this._extHostLogService);
157155

158156
initializeExtensionApi(this, apiFactory).then(() => {
159157

@@ -314,14 +312,14 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
314312
return TPromise.as(new EmptyExtension(ExtensionActivationTimes.NONE));
315313
}
316314

317-
this._logService.info(`ExtensionService#_doActivateExtension ${extensionDescription.id} ${JSON.stringify(reason)}`);
315+
this._extHostLogService.info(`ExtensionService#_doActivateExtension ${extensionDescription.id} ${JSON.stringify(reason)}`);
318316

319317
const activationTimesBuilder = new ExtensionActivationTimesBuilder(reason.startup);
320318
return TPromise.join<any>([
321-
loadCommonJSModule(this._logService, extensionDescription.main, activationTimesBuilder),
319+
loadCommonJSModule(this._extHostLogService, extensionDescription.main, activationTimesBuilder),
322320
this._loadExtensionContext(extensionDescription)
323321
]).then(values => {
324-
return ExtHostExtensionService._callActivate(this._logService, extensionDescription.id, <IExtensionModule>values[0], <IExtensionContext>values[1], activationTimesBuilder);
322+
return ExtHostExtensionService._callActivate(this._extHostLogService, extensionDescription.id, <IExtensionModule>values[0], <IExtensionContext>values[1], activationTimesBuilder);
325323
}, (errors: any[]) => {
326324
// Avoid failing with an array of errors, fail with a single error
327325
if (errors[0]) {
@@ -339,7 +337,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
339337
let globalState = new ExtensionMemento(extensionDescription.id, true, this._storage);
340338
let workspaceState = new ExtensionMemento(extensionDescription.id, false, this._storage);
341339

342-
this._logService.trace(`ExtensionService#loadExtensionContext ${extensionDescription.id}`);
340+
this._extHostLogService.trace(`ExtensionService#loadExtensionContext ${extensionDescription.id}`);
343341
return TPromise.join([
344342
globalState.whenReady,
345343
workspaceState.whenReady,

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,26 @@ import { TPromise } from 'vs/base/common/winjs.base';
1010
import { mkdirp, dirExists } from 'vs/base/node/pfs';
1111
import Event from 'vs/base/common/event';
1212
import { LogLevel } from 'vs/workbench/api/node/extHostTypes';
13-
import { ILogService } from 'vs/platform/log/common/log';
13+
import { ILogService, DelegatedLogService } from 'vs/platform/log/common/log';
1414
import { createSpdLogService } from 'vs/platform/log/node/spdlogService';
1515
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1616
import { memoize } from 'vs/base/common/decorators';
1717
import { ExtHostLogServiceShape } from 'vs/workbench/api/node/extHost.protocol';
18-
import { Disposable } from 'vs/base/common/lifecycle';
1918

20-
export class ExtHostLogService extends Disposable implements ExtHostLogServiceShape {
19+
20+
export class ExtHostLogService extends DelegatedLogService implements ILogService, ExtHostLogServiceShape {
21+
2122
private _loggers: Map<string, ExtHostLogger> = new Map();
2223

2324
constructor(
24-
private _environmentService: IEnvironmentService,
25-
private _logService: ILogService
25+
windowId: number,
26+
private _environmentService: IEnvironmentService
2627
) {
27-
super();
28+
super(createSpdLogService(`exthost${windowId}`, _environmentService));
2829
}
2930

30-
$setLogLevel(level: LogLevel) {
31-
this._logService.setLevel(level);
31+
$setLevel(level: LogLevel): void {
32+
this.setLevel(level);
3233
}
3334

3435
getExtLogger(extensionID: string): ExtHostLogger {
@@ -43,7 +44,7 @@ export class ExtHostLogService extends Disposable implements ExtHostLogServiceSh
4344
private createLogger(extensionID: string): ExtHostLogger {
4445
const logService = createSpdLogService(extensionID, this._environmentService, extensionID);
4546
const logsDirPath = path.join(this._environmentService.logsPath, extensionID);
46-
this._register(this._logService.onDidChangeLogLevel(level => logService.setLevel(level)));
47+
this._register(this.onDidChangeLogLevel(level => logService.setLevel(level)));
4748
return new ExtHostLogger(logService, logsDirPath);
4849
}
4950
}

src/vs/workbench/node/extensionHostMain.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ import * as watchdog from 'native-watchdog';
2121
import * as glob from 'vs/base/common/glob';
2222
import { ExtensionActivatedByEvent } from 'vs/workbench/api/node/extHostExtensionActivator';
2323
import { EnvironmentService } from 'vs/platform/environment/node/environmentService';
24-
import { createSpdLogService } from 'vs/platform/log/node/spdlogService';
2524
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
26-
import { ILogService } from 'vs/platform/log/common/log';
2725
import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc';
2826
import { RPCProtocol } from 'vs/workbench/services/extensions/node/rpcProtocol';
2927
import URI from 'vs/base/common/uri';
28+
import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService';
3029

3130
// const nativeExit = process.exit.bind(process);
3231
function patchProcess(allowExit: boolean) {
@@ -78,7 +77,7 @@ export class ExtensionHostMain {
7877
private _environment: IEnvironment;
7978
private _extensionService: ExtHostExtensionService;
8079
private _extHostConfiguration: ExtHostConfiguration;
81-
private _logService: ILogService;
80+
private _extHostLogService: ExtHostLogService;
8281
private disposables: IDisposable[] = [];
8382

8483
constructor(protocol: IMessagePassingProtocol, initData: IInitData) {
@@ -92,14 +91,14 @@ export class ExtensionHostMain {
9291
const rpcProtocol = new RPCProtocol(protocol);
9392
const extHostWorkspace = new ExtHostWorkspace(rpcProtocol, initData.workspace);
9493
const environmentService = new EnvironmentService(initData.args, initData.execPath);
95-
this._logService = createSpdLogService(`exthost${initData.windowId}`, environmentService);
96-
this.disposables.push(this._logService);
94+
this._extHostLogService = new ExtHostLogService(initData.windowId, environmentService);
95+
this.disposables.push(this._extHostLogService);
9796

98-
this._logService.info('extension host started');
99-
this._logService.trace('initData', initData);
97+
this._extHostLogService.info('extension host started');
98+
this._extHostLogService.trace('initData', initData);
10099

101100
this._extHostConfiguration = new ExtHostConfiguration(rpcProtocol.getProxy(MainContext.MainThreadConfiguration), extHostWorkspace, initData.configuration);
102-
this._extensionService = new ExtHostExtensionService(initData, rpcProtocol, extHostWorkspace, this._extHostConfiguration, this._logService, environmentService);
101+
this._extensionService = new ExtHostExtensionService(initData, rpcProtocol, extHostWorkspace, this._extHostConfiguration, this._extHostLogService, environmentService);
103102

104103
// error forwarding and stack trace scanning
105104
const extensionErrors = new WeakMap<Error, IExtensionDescription>();
@@ -143,7 +142,7 @@ export class ExtensionHostMain {
143142
.then(() => this.handleEagerExtensions())
144143
.then(() => this.handleExtensionTests())
145144
.then(() => {
146-
this._logService.info(`eager extensions activated`);
145+
this._extHostLogService.info(`eager extensions activated`);
147146
});
148147
}
149148

0 commit comments

Comments
 (0)