diff options
author | tanhakabir <takabir@microsoft.com> | 2022-05-11 19:31:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-11 19:31:08 +0300 |
commit | 2872af56af9d74228acb3974664b78b219a2f6d3 (patch) | |
tree | 884d27617b3e71b9edd3c6282cfc7c6fb2909d52 | |
parent | 2297ad5c546b455421e942743e117a3c7c9a873a (diff) |
Expose logger in web embedder API (#147035)
* Expose output channel in web embedder API
* :lipstick:
* Checkpoint
* Remove file dependency on embedder logs
* Add WebEmbedderLog to manage logging for web embedders
* Make disposable
* Remove diff from main
* - Introduce logger for embedder
- Register log chanel only when logging is attempted
* Add extension name ids to embedder logs
* Create separate top-level domain for embedder logging
Re: https://github.com/microsoft/vscode/pull/147035#discussion_r858316123
* Remove id in embedder logging API
Re: https://github.com/microsoft/vscode/pull/147035/commits/a88bc68f4002627fc8d547291b17a69f388c4ff1#r868971486
Co-authored-by: Benjamin Pasero <benjamin.pasero@gmail.com>
Co-authored-by: Sandeep Somavarapu <sasomava@microsoft.com>
-rw-r--r-- | src/vs/workbench/browser/web.api.ts | 12 | ||||
-rw-r--r-- | src/vs/workbench/browser/web.factory.ts | 11 | ||||
-rw-r--r-- | src/vs/workbench/browser/web.main.ts | 14 | ||||
-rw-r--r-- | src/vs/workbench/services/output/common/delayedLogChannel.ts | 33 | ||||
-rw-r--r-- | src/vs/workbench/workbench.web.main.ts | 5 |
5 files changed, 73 insertions, 2 deletions
diff --git a/src/vs/workbench/browser/web.api.ts b/src/vs/workbench/browser/web.api.ts index effacb4a75f..f41ce51c118 100644 --- a/src/vs/workbench/browser/web.api.ts +++ b/src/vs/workbench/browser/web.api.ts @@ -39,6 +39,17 @@ export interface IWorkbench { executeCommand(command: string, ...args: any[]): Promise<unknown>; }; + logger: { + + /** + * Logging for embedder. + * + * @param level The log level of the message to be printed. + * @param message Message to be printed. + */ + log(level: LogLevel, message: string): void; + }; + env: { /** @@ -73,6 +84,7 @@ export interface IWorkbench { }; window: { + /** * Show progress in the editor. Progress is shown while running the given callback * and while the promise it returned isn't resolved nor rejected. diff --git a/src/vs/workbench/browser/web.factory.ts b/src/vs/workbench/browser/web.factory.ts index 49c7eb489e9..993aa0ce071 100644 --- a/src/vs/workbench/browser/web.factory.ts +++ b/src/vs/workbench/browser/web.factory.ts @@ -15,6 +15,7 @@ import { asArray } from 'vs/base/common/arrays'; import { IProgress, IProgressCompositeOptions, IProgressDialogOptions, IProgressNotificationOptions, IProgressOptions, IProgressStep, IProgressWindowOptions } from 'vs/platform/progress/common/progress'; import { IObservableValue } from 'vs/base/common/observableValue'; import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; +import { LogLevel } from 'vs/platform/log/common/log'; let created = false; const workbenchPromise = new DeferredPromise<IWorkbench>(); @@ -94,6 +95,16 @@ export namespace commands { } } +export namespace logger { + + /** + * {@linkcode IWorkbench.logger IWorkbench.logger.log} + */ + export function log(level: LogLevel, message: string) { + workbenchPromise.p.then(workbench => workbench.logger.log(level, message)); + } +} + export namespace env { /** diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 34a5e181dd9..b8dd198abc8 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -50,7 +50,7 @@ import { UserDataSyncStoreManagementService } from 'vs/platform/userDataSync/com import { IUserDataSyncStoreManagementService } from 'vs/platform/userDataSync/common/userDataSync'; import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { localize } from 'vs/nls'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; @@ -71,6 +71,8 @@ import { IWorkspace } from 'vs/workbench/services/host/browser/browserHostServic import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IProgressService } from 'vs/platform/progress/common/progress'; +import { DelayedLogChannel } from 'vs/workbench/services/output/common/delayedLogChannel'; +import { dirname, joinPath } from 'vs/base/common/resources'; export class BrowserMain extends Disposable { @@ -128,6 +130,10 @@ export class BrowserMain extends Disposable { const productService = accessor.get(IProductService); const telemetryService = accessor.get(ITelemetryService); const progessService = accessor.get(IProgressService); + const environmentService = accessor.get(IBrowserWorkbenchEnvironmentService); + const instantiationService = accessor.get(IInstantiationService); + + const embedderLogger = instantiationService.createInstance(DelayedLogChannel, 'webEmbedder', productService.embedderIdentifier || localize('vscode.dev', "vscode.dev"), joinPath(dirname(environmentService.logFile), `webEmbedder.log`)); return { commands: { @@ -147,6 +153,11 @@ export class BrowserMain extends Disposable { return openerService.open(uri, {}); } }, + logger: { + log: (level, message) => { + embedderLogger.log(level, message); + } + }, window: { withProgress: (options, task) => progessService.withProgress(options, task) }, @@ -334,6 +345,7 @@ export class BrowserMain extends Disposable { } else { fileService.registerProvider(logsPath.scheme, new InMemoryFileSystemProvider()); } + logService.logger = new MultiplexLogService(coalesce([ new ConsoleLogger(logService.getLevel()), new FileLogger('window', environmentService.logFile, logService.getLevel(), false, fileService), diff --git a/src/vs/workbench/services/output/common/delayedLogChannel.ts b/src/vs/workbench/services/output/common/delayedLogChannel.ts new file mode 100644 index 00000000000..f0fc686c3b8 --- /dev/null +++ b/src/vs/workbench/services/output/common/delayedLogChannel.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ILogger, ILoggerService, ILogService, log, LogLevel } from 'vs/platform/log/common/log'; +import { registerLogChannel } from 'vs/workbench/services/output/common/output'; +import { URI } from 'vs/base/common/uri'; +import { IFileService } from 'vs/platform/files/common/files'; + +export class DelayedLogChannel { + + private readonly logger: ILogger; + + constructor( + private readonly id: string, private readonly name: string, private readonly file: URI, + @ILoggerService loggerService: ILoggerService, + @IFileService private readonly fileService: IFileService, + @ILogService private readonly logService: ILogService, + ) { + this.logger = loggerService.createLogger(file, { name }); + } + + private registerLogChannelPromise: Promise<void> | undefined; + log(level: LogLevel, message: string): void { + if (!this.registerLogChannelPromise) { + // Register log channel only when logging is actually attempted + this.registerLogChannelPromise = registerLogChannel(this.id, this.name, this.file, this.fileService, this.logService); + } + log(this.logger, level, message); + } + +} diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 925c0010a0b..7cc89fe419b 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -169,7 +169,7 @@ import 'vs/workbench/contrib/offline/browser/offline.contribution'; // // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -import { create, commands, env, window } from 'vs/workbench/browser/web.factory'; +import { create, commands, env, window, logger } from 'vs/workbench/browser/web.factory'; import { IWorkbench, ICommand, ICommonTelemetryPropertiesResolver, IDefaultEditor, IDefaultLayout, IDefaultView, IDevelopmentOptions, IExternalUriResolver, IExternalURLOpener, IHomeIndicator, IInitialColorTheme, IPosition, IProductQualityChangeHandler, IRange, IResourceUriProvider, ISettingsSyncOptions, IShowPortCandidate, ITunnel, ITunnelFactory, ITunnelOptions, ITunnelProvider, IWelcomeBanner, IWelcomeBannerAction, IWindowIndicator, IWorkbenchConstructionOptions, Menu } from 'vs/workbench/browser/web.api'; import { UriComponents, URI } from 'vs/base/common/uri'; import { IWebSocketFactory, IWebSocket } from 'vs/platform/remote/browser/browserSocketFactory'; @@ -250,6 +250,9 @@ export { commands, Menu, + // Logger + logger, + // Window window, |