This commit is contained in:
Sandeep Somavarapu
2025-12-19 18:29:34 +01:00
committed by GitHub
parent 5e032c52ca
commit e94fb8bfc8
11 changed files with 92 additions and 65 deletions

View File

@@ -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;

View File

@@ -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() {

View File

@@ -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);

View File

@@ -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.';

View File

@@ -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);

View File

@@ -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,

View File

@@ -71,7 +71,7 @@ export interface IEnvironment {
workspaceStorageHome: URI;
useHostProxy?: boolean;
skipWorkspaceStorageLock?: boolean;
extensionLogLevel?: [string, string][];
extensionLogLevel?: [string, LogLevel][];
}
export interface IStaticWorkspaceData {

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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';