mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-24 20:26:08 +00:00
committed by
GitHub
parent
5e032c52ca
commit
e94fb8bfc8
@@ -9,7 +9,7 @@ import { URI } from '../../../base/common/uri.js';
|
||||
import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';
|
||||
import { IExtHostRpcService } from './extHostRpcService.js';
|
||||
import { ExtensionIdentifier, IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
|
||||
import { AbstractMessageLogger, ILogger, ILoggerService, ILogService, log, LogLevel, parseLogLevel } from '../../../platform/log/common/log.js';
|
||||
import { AbstractMessageLogger, ILogger, ILoggerService, ILogService, log, LogLevel } from '../../../platform/log/common/log.js';
|
||||
import { OutputChannelUpdateMode } from '../../services/output/common/output.js';
|
||||
import { IExtHostConsumerFileSystem } from './extHostFileSystemConsumer.js';
|
||||
import { IExtHostInitDataService } from './extHostInitDataService.js';
|
||||
@@ -20,6 +20,7 @@ import { isString } from '../../../base/common/types.js';
|
||||
import { FileSystemProviderErrorCode, toFileSystemProviderErrorCode } from '../../../platform/files/common/files.js';
|
||||
import { Emitter } from '../../../base/common/event.js';
|
||||
import { DisposableStore, toDisposable } from '../../../base/common/lifecycle.js';
|
||||
import { ResourceMap } from '../../../base/common/map.js';
|
||||
|
||||
class ExtHostOutputChannel extends AbstractMessageLogger implements vscode.LogOutputChannel {
|
||||
|
||||
@@ -103,7 +104,7 @@ export class ExtHostOutputService implements ExtHostOutputServiceShape {
|
||||
|
||||
private readonly outputsLocation: URI;
|
||||
private outputDirectoryPromise: Thenable<URI> | undefined;
|
||||
private readonly extensionLogDirectoryPromise = new Map<string, Thenable<URI>>();
|
||||
private readonly extensionLogDirectoryCreationPromise = new ResourceMap<Thenable<void>>();
|
||||
private namePool: number = 1;
|
||||
|
||||
private readonly channels = new Map<string, ExtHostLogOutputChannel | ExtHostOutputChannel>();
|
||||
@@ -138,23 +139,27 @@ export class ExtHostOutputService implements ExtHostOutputServiceShape {
|
||||
if (isString(languageId) && !languageId.trim()) {
|
||||
throw new Error('illegal argument `languageId`. must not be empty');
|
||||
}
|
||||
let logLevel: LogLevel | undefined;
|
||||
const logLevelValue = this.initData.environment.extensionLogLevel?.find(([identifier]) => ExtensionIdentifier.equals(extension.identifier, identifier))?.[1];
|
||||
if (logLevelValue) {
|
||||
logLevel = parseLogLevel(logLevelValue);
|
||||
}
|
||||
|
||||
const channelDisposables = new DisposableStore();
|
||||
const extHostOutputChannel = log
|
||||
? this.doCreateLogOutputChannel(name, logLevel, extension, channelDisposables)
|
||||
: this.doCreateOutputChannel(name, languageId, extension, channelDisposables);
|
||||
extHostOutputChannel.then(channel => {
|
||||
let extHostOutputChannelPromise;
|
||||
let logLevel = this.initData.environment.extensionLogLevel?.find(([identifier]) => ExtensionIdentifier.equals(extension.identifier, identifier))?.[1];
|
||||
if (log) {
|
||||
const extensionLogDirectory = this.extHostFileSystemInfo.extUri.joinPath(this.initData.logsLocation, extension.identifier.value);
|
||||
const extensionLogFile = this.extHostFileSystemInfo.extUri.joinPath(extensionLogDirectory, `${name.replace(/[\\/:\*\?"<>\|]/g, '')}.log`);
|
||||
logLevel = this.loggerService.getLogLevel(extensionLogFile) ?? logLevel;
|
||||
extHostOutputChannelPromise = this.doCreateLogOutputChannel(name, extensionLogFile, logLevel, extension, channelDisposables);
|
||||
} else {
|
||||
extHostOutputChannelPromise = this.doCreateOutputChannel(name, languageId, extension, channelDisposables);
|
||||
}
|
||||
|
||||
extHostOutputChannelPromise.then(channel => {
|
||||
this.channels.set(channel.id, channel);
|
||||
channel.visible = channel.id === this.visibleChannelId;
|
||||
channelDisposables.add(toDisposable(() => this.channels.delete(channel.id)));
|
||||
});
|
||||
return log
|
||||
? this.createExtHostLogOutputChannel(name, logLevel ?? this.logService.getLevel(), <Promise<ExtHostOutputChannel>>extHostOutputChannel, channelDisposables)
|
||||
: this.createExtHostOutputChannel(name, <Promise<ExtHostOutputChannel>>extHostOutputChannel, channelDisposables);
|
||||
? this.createExtHostLogOutputChannel(name, logLevel ?? this.logService.getLevel(), <Promise<ExtHostOutputChannel>>extHostOutputChannelPromise, channelDisposables)
|
||||
: this.createExtHostOutputChannel(name, <Promise<ExtHostOutputChannel>>extHostOutputChannelPromise, channelDisposables);
|
||||
}
|
||||
|
||||
private async doCreateOutputChannel(name: string, languageId: string | undefined, extension: IExtensionDescription, channelDisposables: DisposableStore): Promise<ExtHostOutputChannel> {
|
||||
@@ -169,21 +174,19 @@ export class ExtHostOutputService implements ExtHostOutputServiceShape {
|
||||
return new ExtHostOutputChannel(id, name, logger, this.proxy, extension);
|
||||
}
|
||||
|
||||
private async doCreateLogOutputChannel(name: string, logLevel: LogLevel | undefined, extension: IExtensionDescription, channelDisposables: DisposableStore): Promise<ExtHostLogOutputChannel> {
|
||||
const extensionLogDir = await this.createExtensionLogDirectory(extension);
|
||||
const fileName = name.replace(/[\\/:\*\?"<>\|]/g, '');
|
||||
const file = this.extHostFileSystemInfo.extUri.joinPath(extensionLogDir, `${fileName}.log`);
|
||||
const id = `${extension.identifier.value}.${fileName}`;
|
||||
private async doCreateLogOutputChannel(name: string, file: URI, logLevel: LogLevel | undefined, extension: IExtensionDescription, channelDisposables: DisposableStore): Promise<ExtHostLogOutputChannel> {
|
||||
await this.createExtensionLogDirectory(file);
|
||||
const id = `${extension.identifier.value}.${this.extHostFileSystemInfo.extUri.basename(file)}`;
|
||||
const logger = channelDisposables.add(this.loggerService.createLogger(file, { id, name, logLevel, extensionId: extension.identifier.value }));
|
||||
channelDisposables.add(toDisposable(() => this.loggerService.deregisterLogger(file)));
|
||||
return new ExtHostLogOutputChannel(id, name, logger, this.proxy, extension);
|
||||
}
|
||||
|
||||
private createExtensionLogDirectory(extension: IExtensionDescription): Thenable<URI> {
|
||||
let extensionLogDirectoryPromise = this.extensionLogDirectoryPromise.get(extension.identifier.value);
|
||||
private createExtensionLogDirectory(file: URI): Thenable<void> {
|
||||
const extensionLogDirectory = this.extHostFileSystemInfo.extUri.dirname(file);
|
||||
let extensionLogDirectoryPromise = this.extensionLogDirectoryCreationPromise.get(extensionLogDirectory);
|
||||
if (!extensionLogDirectoryPromise) {
|
||||
const extensionLogDirectory = this.extHostFileSystemInfo.extUri.joinPath(this.initData.logsLocation, extension.identifier.value);
|
||||
this.extensionLogDirectoryPromise.set(extension.identifier.value, extensionLogDirectoryPromise = (async () => {
|
||||
this.extensionLogDirectoryCreationPromise.set(extensionLogDirectory, extensionLogDirectoryPromise = (async () => {
|
||||
try {
|
||||
await this.extHostFileSystem.value.createDirectory(extensionLogDirectory);
|
||||
} catch (err) {
|
||||
@@ -191,7 +194,6 @@ export class ExtHostOutputService implements ExtHostOutputServiceShape {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
return extensionLogDirectory;
|
||||
})());
|
||||
}
|
||||
return extensionLogDirectoryPromise;
|
||||
|
||||
@@ -16,11 +16,11 @@ import { LifecyclePhase } from '../../../services/lifecycle/common/lifecycle.js'
|
||||
import { IInstantiationService, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
|
||||
import { Event } from '../../../../base/common/event.js';
|
||||
import { windowLogId, showWindowLogActionId } from '../../../services/log/common/logConstants.js';
|
||||
import { IDefaultLogLevelsService } from './defaultLogLevels.js';
|
||||
import { ContextKeyExpr, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
|
||||
import { CounterSet } from '../../../../base/common/map.js';
|
||||
import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js';
|
||||
import { Schemas } from '../../../../base/common/network.js';
|
||||
import { IDefaultLogLevelsService } from '../../../services/log/common/defaultLogLevels.js';
|
||||
|
||||
registerAction2(class extends Action2 {
|
||||
constructor() {
|
||||
|
||||
@@ -13,10 +13,10 @@ import { IWorkbenchEnvironmentService } from '../../../services/environment/comm
|
||||
import { dirname, basename, isEqual } from '../../../../base/common/resources.js';
|
||||
import { IEditorService } from '../../../services/editor/common/editorService.js';
|
||||
import { IOutputChannelDescriptor, IOutputService, isMultiSourceOutputChannelDescriptor, isSingleSourceOutputChannelDescriptor } from '../../../services/output/common/output.js';
|
||||
import { IDefaultLogLevelsService } from './defaultLogLevels.js';
|
||||
import { Codicon } from '../../../../base/common/codicons.js';
|
||||
import { ThemeIcon } from '../../../../base/common/themables.js';
|
||||
import { DisposableStore } from '../../../../base/common/lifecycle.js';
|
||||
import { IDefaultLogLevelsService } from '../../../services/log/common/defaultLogLevels.js';
|
||||
|
||||
type LogLevelQuickPickItem = IQuickPickItem & { level: LogLevel };
|
||||
type LogChannelQuickPickItem = IQuickPickItem & { id: string; channel: IOutputChannelDescriptor };
|
||||
@@ -47,7 +47,7 @@ export class SetLogLevelAction extends Action {
|
||||
}
|
||||
|
||||
private async selectLogLevelOrChannel(): Promise<LogChannelQuickPickItem | LogLevel | null> {
|
||||
const defaultLogLevels = await this.defaultLogLevelsService.getDefaultLogLevels();
|
||||
const defaultLogLevels = this.defaultLogLevelsService.defaultLogLevels;
|
||||
const extensionLogs: LogChannelQuickPickItem[] = [], logs: LogChannelQuickPickItem[] = [];
|
||||
const logLevel = this.loggerService.getLogLevel();
|
||||
for (const channel of this.outputService.getChannelDescriptors()) {
|
||||
@@ -105,7 +105,7 @@ export class SetLogLevelAction extends Action {
|
||||
}
|
||||
|
||||
private async setLogLevelForChannel(logChannel: LogChannelQuickPickItem): Promise<void> {
|
||||
const defaultLogLevels = await this.defaultLogLevelsService.getDefaultLogLevels();
|
||||
const defaultLogLevels = this.defaultLogLevelsService.defaultLogLevels;
|
||||
const defaultLogLevel = defaultLogLevels.extensions.find(e => e[0] === logChannel.channel.extensionId?.toLowerCase())?.[1] ?? defaultLogLevels.default;
|
||||
const entries = this.getLogLevelEntries(defaultLogLevel, this.outputService.getLogLevel(logChannel.channel) ?? defaultLogLevel, !!logChannel.channel.extensionId);
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@ import { Categories } from '../../../../platform/action/common/actionCommonCateg
|
||||
import { Disposable, dispose, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
|
||||
import { AccessibilitySignal, IAccessibilitySignalService } from '../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';
|
||||
import { ILoggerService, LogLevel, LogLevelToLocalizedString, LogLevelToString } from '../../../../platform/log/common/log.js';
|
||||
import { IDefaultLogLevelsService } from '../../logs/common/defaultLogLevels.js';
|
||||
import { KeybindingsRegistry, KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
|
||||
import { EditorContextKeys } from '../../../../editor/common/editorContextKeys.js';
|
||||
import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from '../../../../platform/accessibility/common/accessibility.js';
|
||||
@@ -43,6 +42,7 @@ import { IFileDialogService } from '../../../../platform/dialogs/common/dialogs.
|
||||
import { basename } from '../../../../base/common/resources.js';
|
||||
import { URI } from '../../../../base/common/uri.js';
|
||||
import { hasKey } from '../../../../base/common/types.js';
|
||||
import { IDefaultLogLevelsService } from '../../../services/log/common/defaultLogLevels.js';
|
||||
|
||||
const IMPORTED_LOG_ID_PREFIX = 'importedLog.';
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ import { IViewsService } from '../../../services/views/common/viewsService.js';
|
||||
import { OutputViewPane } from './outputView.js';
|
||||
import { ILanguageService } from '../../../../editor/common/languages/language.js';
|
||||
import { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
|
||||
import { IDefaultLogLevelsService } from '../../logs/common/defaultLogLevels.js';
|
||||
import { IFileDialogService } from '../../../../platform/dialogs/common/dialogs.js';
|
||||
import { IFileService } from '../../../../platform/files/common/files.js';
|
||||
import { localize } from '../../../../nls.js';
|
||||
@@ -30,6 +29,7 @@ import { VSBuffer } from '../../../../base/common/buffer.js';
|
||||
import { telemetryLogId } from '../../../../platform/telemetry/common/telemetryUtils.js';
|
||||
import { toLocalISOString } from '../../../../base/common/date.js';
|
||||
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
|
||||
import { IDefaultLogLevelsService } from '../../../services/log/common/defaultLogLevels.js';
|
||||
|
||||
const OUTPUT_ACTIVE_CHANNEL_KEY = 'output.activechannel';
|
||||
|
||||
@@ -605,7 +605,7 @@ export class OutputService extends Disposable implements IOutputService, ITextMo
|
||||
const descriptor = this.activeChannel?.outputChannelDescriptor;
|
||||
const channelLogLevel = descriptor ? this.getLogLevel(descriptor) : undefined;
|
||||
if (channelLogLevel !== undefined) {
|
||||
const channelDefaultLogLevel = await this.defaultLogLevelsService.getDefaultLogLevel(descriptor?.extensionId);
|
||||
const channelDefaultLogLevel = this.defaultLogLevelsService.getDefaultLogLevel(descriptor?.extensionId);
|
||||
this.activeOutputChannelLevelIsDefaultContext.set(channelDefaultLogLevel === channelLogLevel);
|
||||
} else {
|
||||
this.activeOutputChannelLevelIsDefaultContext.set(false);
|
||||
|
||||
@@ -30,6 +30,7 @@ import { WebWorkerDescriptor } from '../../../../platform/webWorker/browser/webW
|
||||
import { IWebWorkerService } from '../../../../platform/webWorker/browser/webWorkerService.js';
|
||||
import { IWorkspaceContextService, WorkbenchState } from '../../../../platform/workspace/common/workspace.js';
|
||||
import { IBrowserWorkbenchEnvironmentService } from '../../environment/browser/environmentService.js';
|
||||
import { IDefaultLogLevelsService } from '../../log/common/defaultLogLevels.js';
|
||||
import { ExtensionHostExitCode, IExtensionHostInitData, MessageType, UIKind, createMessageOfType, isMessageOfType } from '../common/extensionHostProtocol.js';
|
||||
import { LocalWebWorkerRunningLocation } from '../common/extensionRunningLocation.js';
|
||||
import { ExtensionHostExtensions, ExtensionHostStartup, IExtensionHost } from '../common/extensions.js';
|
||||
@@ -72,6 +73,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
|
||||
@ILayoutService private readonly _layoutService: ILayoutService,
|
||||
@IStorageService private readonly _storageService: IStorageService,
|
||||
@IWebWorkerService private readonly _webWorkerService: IWebWorkerService,
|
||||
@IDefaultLogLevelsService private readonly _defaultLogLevelsService: IDefaultLogLevelsService,
|
||||
) {
|
||||
super();
|
||||
this._isTerminating = false;
|
||||
@@ -315,7 +317,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
|
||||
extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI,
|
||||
globalStorageHome: this._userDataProfilesService.defaultProfile.globalStorageHome,
|
||||
workspaceStorageHome: this._environmentService.workspaceStorageHome,
|
||||
extensionLogLevel: this._environmentService.extensionLogLevel
|
||||
extensionLogLevel: this._defaultLogLevelsService.defaultLogLevels.extensions
|
||||
},
|
||||
workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : {
|
||||
configuration: workspace.configuration || undefined,
|
||||
|
||||
@@ -71,7 +71,7 @@ export interface IEnvironment {
|
||||
workspaceStorageHome: URI;
|
||||
useHostProxy?: boolean;
|
||||
skipWorkspaceStorageLock?: boolean;
|
||||
extensionLogLevel?: [string, string][];
|
||||
extensionLogLevel?: [string, LogLevel][];
|
||||
}
|
||||
|
||||
export interface IStaticWorkspaceData {
|
||||
|
||||
@@ -23,6 +23,7 @@ import { ITelemetryService } from '../../../../platform/telemetry/common/telemet
|
||||
import { isLoggingOnly } from '../../../../platform/telemetry/common/telemetryUtils.js';
|
||||
import { IWorkspaceContextService, WorkbenchState } from '../../../../platform/workspace/common/workspace.js';
|
||||
import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService.js';
|
||||
import { IDefaultLogLevelsService } from '../../log/common/defaultLogLevels.js';
|
||||
import { parseExtensionDevOptions } from './extensionDevOptions.js';
|
||||
import { IExtensionHostInitData, MessageType, UIKind, createMessageOfType, isMessageOfType } from './extensionHostProtocol.js';
|
||||
import { RemoteRunningLocation } from './extensionRunningLocation.js';
|
||||
@@ -72,7 +73,8 @@ export class RemoteExtensionHost extends Disposable implements IExtensionHost {
|
||||
@IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService,
|
||||
@IExtensionHostDebugService private readonly _extensionHostDebugService: IExtensionHostDebugService,
|
||||
@IProductService private readonly _productService: IProductService,
|
||||
@ISignService private readonly _signService: ISignService
|
||||
@ISignService private readonly _signService: ISignService,
|
||||
@IDefaultLogLevelsService private readonly _defaultLogLevelsService: IDefaultLogLevelsService,
|
||||
) {
|
||||
super();
|
||||
this.remoteAuthority = this._initDataProvider.remoteAuthority;
|
||||
@@ -223,7 +225,7 @@ export class RemoteExtensionHost extends Disposable implements IExtensionHost {
|
||||
extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI,
|
||||
globalStorageHome: remoteInitData.globalStorageHome,
|
||||
workspaceStorageHome: remoteInitData.workspaceStorageHome,
|
||||
extensionLogLevel: this._environmentService.extensionLogLevel
|
||||
extensionLogLevel: this._defaultLogLevelsService.defaultLogLevels.extensions
|
||||
},
|
||||
workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : {
|
||||
configuration: workspace.configuration,
|
||||
|
||||
@@ -38,6 +38,7 @@ import { ExtensionHostExtensions, ExtensionHostStartup, IExtensionHost, IExtensi
|
||||
import { IHostService } from '../../host/browser/host.js';
|
||||
import { ILifecycleService, WillShutdownEvent } from '../../lifecycle/common/lifecycle.js';
|
||||
import { parseExtensionDevOptions } from '../common/extensionDevOptions.js';
|
||||
import { IDefaultLogLevelsService } from '../../log/common/defaultLogLevels.js';
|
||||
|
||||
export interface ILocalProcessExtensionHostInitData {
|
||||
readonly extensions: ExtensionHostExtensions;
|
||||
@@ -131,6 +132,7 @@ export class NativeLocalProcessExtensionHost extends Disposable implements IExte
|
||||
@IProductService private readonly _productService: IProductService,
|
||||
@IShellEnvironmentService private readonly _shellEnvironmentService: IShellEnvironmentService,
|
||||
@IExtensionHostStarter private readonly _extensionHostStarter: IExtensionHostStarter,
|
||||
@IDefaultLogLevelsService private readonly _defaultLogLevelsService: IDefaultLogLevelsService,
|
||||
) {
|
||||
super();
|
||||
const devOpts = parseExtensionDevOptions(this._environmentService);
|
||||
@@ -485,7 +487,7 @@ export class NativeLocalProcessExtensionHost extends Disposable implements IExte
|
||||
extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI,
|
||||
globalStorageHome: this._userDataProfilesService.defaultProfile.globalStorageHome,
|
||||
workspaceStorageHome: this._environmentService.workspaceStorageHome,
|
||||
extensionLogLevel: this._environmentService.extensionLogLevel
|
||||
extensionLogLevel: this._defaultLogLevelsService.defaultLogLevels.extensions
|
||||
},
|
||||
workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? undefined : {
|
||||
configuration: workspace.configuration ?? undefined,
|
||||
|
||||
@@ -14,6 +14,7 @@ import { InstantiationType, registerSingleton } from '../../../../platform/insta
|
||||
import { parse } from '../../../../base/common/json.js';
|
||||
import { Disposable } from '../../../../base/common/lifecycle.js';
|
||||
import { Emitter, Event } from '../../../../base/common/event.js';
|
||||
import { equals } from '../../../../base/common/objects.js';
|
||||
|
||||
interface ParsedArgvLogLevels {
|
||||
default?: LogLevel;
|
||||
@@ -28,15 +29,10 @@ export interface IDefaultLogLevelsService {
|
||||
|
||||
readonly _serviceBrand: undefined;
|
||||
|
||||
/**
|
||||
* An event which fires when default log levels are changed
|
||||
*/
|
||||
readonly onDidChangeDefaultLogLevels: Event<void>;
|
||||
|
||||
getDefaultLogLevels(): Promise<DefaultLogLevels>;
|
||||
|
||||
getDefaultLogLevel(extensionId?: string): Promise<LogLevel>;
|
||||
readonly defaultLogLevels: DefaultLogLevels;
|
||||
readonly onDidChangeDefaultLogLevels: Event<DefaultLogLevels>;
|
||||
|
||||
getDefaultLogLevel(extensionId?: string): LogLevel;
|
||||
setDefaultLogLevel(logLevel: LogLevel, extensionId?: string): Promise<void>;
|
||||
}
|
||||
|
||||
@@ -44,9 +40,11 @@ class DefaultLogLevelsService extends Disposable implements IDefaultLogLevelsSer
|
||||
|
||||
_serviceBrand: undefined;
|
||||
|
||||
private _onDidChangeDefaultLogLevels = this._register(new Emitter<void>);
|
||||
private _onDidChangeDefaultLogLevels = this._register(new Emitter<DefaultLogLevels>);
|
||||
readonly onDidChangeDefaultLogLevels = this._onDidChangeDefaultLogLevels.event;
|
||||
|
||||
private _defaultLogLevels: DefaultLogLevels;
|
||||
|
||||
constructor(
|
||||
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
|
||||
@IFileService private readonly fileService: IFileService,
|
||||
@@ -55,39 +53,59 @@ class DefaultLogLevelsService extends Disposable implements IDefaultLogLevelsSer
|
||||
@ILoggerService private readonly loggerService: ILoggerService,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
async getDefaultLogLevels(): Promise<DefaultLogLevels> {
|
||||
const argvLogLevel = await this._parseLogLevelsFromArgv();
|
||||
return {
|
||||
default: argvLogLevel?.default ?? this._getDefaultLogLevelFromEnv(),
|
||||
extensions: argvLogLevel?.extensions ?? this._getExtensionsDefaultLogLevelsFromEnv()
|
||||
this._defaultLogLevels = {
|
||||
default: this._getDefaultLogLevelFromEnv(),
|
||||
extensions: this._getExtensionsDefaultLogLevelsFromEnv()
|
||||
};
|
||||
this._register(this.fileService.onDidFilesChange(e => {
|
||||
if (e.contains(this.environmentService.argvResource)) {
|
||||
this.onDidChangeArgv();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
async getDefaultLogLevel(extensionId?: string): Promise<LogLevel> {
|
||||
const argvLogLevel = await this._parseLogLevelsFromArgv() ?? {};
|
||||
private async onDidChangeArgv(): Promise<void> {
|
||||
const defaultLogLevelsFromArgv = await this._parseLogLevelsFromArgv();
|
||||
this.updateDefaultLogLevels(defaultLogLevelsFromArgv);
|
||||
}
|
||||
|
||||
get defaultLogLevels(): DefaultLogLevels {
|
||||
return this._defaultLogLevels;
|
||||
}
|
||||
|
||||
private updateDefaultLogLevels(defaultLogLevelsFromArgv: ParsedArgvLogLevels | undefined): void {
|
||||
const defaultLogLevels = {
|
||||
default: defaultLogLevelsFromArgv?.default ?? this._getDefaultLogLevelFromEnv(),
|
||||
extensions: defaultLogLevelsFromArgv?.extensions ?? this._getExtensionsDefaultLogLevelsFromEnv()
|
||||
};
|
||||
if (!equals(this._defaultLogLevels, defaultLogLevels)) {
|
||||
this._defaultLogLevels = defaultLogLevels;
|
||||
this._onDidChangeDefaultLogLevels.fire(this._defaultLogLevels);
|
||||
}
|
||||
}
|
||||
|
||||
getDefaultLogLevel(extensionId?: string): LogLevel {
|
||||
if (extensionId) {
|
||||
extensionId = extensionId.toLowerCase();
|
||||
return this._getDefaultLogLevel(argvLogLevel, extensionId);
|
||||
return this._getDefaultLogLevel(this._defaultLogLevels, extensionId);
|
||||
} else {
|
||||
return this._getDefaultLogLevel(argvLogLevel);
|
||||
return this._getDefaultLogLevel(this._defaultLogLevels);
|
||||
}
|
||||
}
|
||||
|
||||
async setDefaultLogLevel(defaultLogLevel: LogLevel, extensionId?: string): Promise<void> {
|
||||
const argvLogLevel = await this._parseLogLevelsFromArgv() ?? {};
|
||||
const defaultLogLevelsFromArgv = await this._parseLogLevelsFromArgv() ?? {};
|
||||
if (extensionId) {
|
||||
extensionId = extensionId.toLowerCase();
|
||||
const currentDefaultLogLevel = this._getDefaultLogLevel(argvLogLevel, extensionId);
|
||||
argvLogLevel.extensions = argvLogLevel.extensions ?? [];
|
||||
const extension = argvLogLevel.extensions.find(([extension]) => extension === extensionId);
|
||||
const currentDefaultLogLevel = this._getDefaultLogLevel(defaultLogLevelsFromArgv, extensionId);
|
||||
defaultLogLevelsFromArgv.extensions = defaultLogLevelsFromArgv.extensions ?? [];
|
||||
const extension = defaultLogLevelsFromArgv.extensions.find(([extension]) => extension === extensionId);
|
||||
if (extension) {
|
||||
extension[1] = defaultLogLevel;
|
||||
} else {
|
||||
argvLogLevel.extensions.push([extensionId, defaultLogLevel]);
|
||||
defaultLogLevelsFromArgv.extensions.push([extensionId, defaultLogLevel]);
|
||||
}
|
||||
await this._writeLogLevelsToArgv(argvLogLevel);
|
||||
await this._writeLogLevelsToArgv(defaultLogLevelsFromArgv);
|
||||
const extensionLoggers = [...this.loggerService.getRegisteredLoggers()].filter(logger => logger.extensionId && logger.extensionId.toLowerCase() === extensionId);
|
||||
for (const { resource } of extensionLoggers) {
|
||||
if (this.loggerService.getLogLevel(resource) === currentDefaultLogLevel) {
|
||||
@@ -95,14 +113,14 @@ class DefaultLogLevelsService extends Disposable implements IDefaultLogLevelsSer
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const currentLogLevel = this._getDefaultLogLevel(argvLogLevel);
|
||||
argvLogLevel.default = defaultLogLevel;
|
||||
await this._writeLogLevelsToArgv(argvLogLevel);
|
||||
const currentLogLevel = this._getDefaultLogLevel(defaultLogLevelsFromArgv);
|
||||
defaultLogLevelsFromArgv.default = defaultLogLevel;
|
||||
await this._writeLogLevelsToArgv(defaultLogLevelsFromArgv);
|
||||
if (this.loggerService.getLogLevel() === currentLogLevel) {
|
||||
this.loggerService.setLogLevel(defaultLogLevel);
|
||||
}
|
||||
}
|
||||
this._onDidChangeDefaultLogLevels.fire();
|
||||
this.updateDefaultLogLevels(defaultLogLevelsFromArgv);
|
||||
}
|
||||
|
||||
private _getDefaultLogLevel(argvLogLevels: ParsedArgvLogLevels, extension?: string): LogLevel {
|
||||
@@ -132,6 +132,7 @@ import './services/editor/common/customEditorLabelService.js';
|
||||
import './services/dataChannel/browser/dataChannelService.js';
|
||||
import './services/inlineCompletions/common/inlineCompletionsUnification.js';
|
||||
import './services/chat/common/chatEntitlementService.js';
|
||||
import './services/log/common/defaultLogLevels.js';
|
||||
|
||||
import { InstantiationType, registerSingleton } from '../platform/instantiation/common/extensions.js';
|
||||
import { GlobalExtensionEnablementService } from '../platform/extensionManagement/common/extensionEnablementService.js';
|
||||
|
||||
Reference in New Issue
Block a user