@@ -13,12 +13,19 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
13
13
import { dirname , basename , isEqual } from 'vs/base/common/resources' ;
14
14
import { IEditorService } from 'vs/workbench/services/editor/common/editorService' ;
15
15
import { IOutputChannelDescriptor , IOutputService } from 'vs/workbench/services/output/common/output' ;
16
- import { isUndefined } from 'vs/base/common/types' ;
16
+ import { isNumber } from 'vs/base/common/types' ;
17
17
import { ILogLevelService } from 'vs/workbench/contrib/logs/common/logLevelService' ;
18
18
import { extensionTelemetryLogChannelId , telemetryLogChannelId } from 'vs/workbench/contrib/logs/common/logConstants' ;
19
19
import { IEnvironmentService } from 'vs/platform/environment/common/environment' ;
20
20
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil' ;
21
21
22
+ type LogLevelQuickPickItem = IQuickPickItem & { level : LogLevel } ;
23
+ type LogChannelQuickPickItem = IQuickPickItem & { channel : IOutputChannelDescriptor } ;
24
+
25
+ function isLogLevel ( thing : unknown ) : thing is LogLevel {
26
+ return isNumber ( thing ) ;
27
+ }
28
+
22
29
export class SetLogLevelAction extends Action {
23
30
24
31
static readonly ID = 'workbench.action.setLogLevel' ;
@@ -35,13 +42,17 @@ export class SetLogLevelAction extends Action {
35
42
}
36
43
37
44
override async run ( ) : Promise < void > {
38
- const logChannel = await this . selectLogChannel ( ) ;
39
- if ( ! isUndefined ( logChannel ) ) {
40
- await this . selectLogLevel ( logChannel ) ;
45
+ const logLevelOrChannel = await this . selectLogLevelOrChannel ( ) ;
46
+ if ( logLevelOrChannel !== null ) {
47
+ if ( isLogLevel ( logLevelOrChannel ) ) {
48
+ this . logService . setLevel ( logLevelOrChannel ) ;
49
+ } else {
50
+ await this . setLogLevelForChannel ( logLevelOrChannel ) ;
51
+ }
41
52
}
42
53
}
43
54
44
- private async selectLogChannel ( ) : Promise < IOutputChannelDescriptor | undefined | null > {
55
+ private async selectLogLevelOrChannel ( ) : Promise < IOutputChannelDescriptor | LogLevel | null > {
45
56
const extensionLogs = [ ] , logs = [ ] ;
46
57
for ( const channel of this . outputService . getChannelDescriptors ( ) ) {
47
58
if ( ! channel . log || channel . id === telemetryLogChannelId || channel . id === extensionTelemetryLogChannelId ) {
@@ -53,49 +64,68 @@ export class SetLogLevelAction extends Action {
53
64
logs . push ( channel ) ;
54
65
}
55
66
}
56
- const entries : ( { label : string ; channel ?: IOutputChannelDescriptor } | IQuickPickSeparator ) [ ] = [ ] ;
57
- entries . push ( { label : nls . localize ( 'all' , "All" ) } ) ;
67
+ const entries : ( LogLevelQuickPickItem | LogChannelQuickPickItem | IQuickPickSeparator ) [ ] = [ ] ;
68
+ entries . push ( { type : 'separator' , label : nls . localize ( 'all' , "All" ) } ) ;
69
+ entries . push ( ...this . getLogLevelEntries ( this . getDefaultLogLevel ( null ) , this . logService . getLevel ( ) ) ) ;
58
70
entries . push ( { type : 'separator' , label : nls . localize ( 'loggers' , "Logs" ) } ) ;
71
+ const logLevel = this . logService . getLevel ( ) ;
59
72
for ( const channel of logs . sort ( ( a , b ) => a . label . localeCompare ( b . label ) ) ) {
60
- entries . push ( { label : channel . label , channel } ) ;
73
+ const channelLogLevel = this . logLevelService . getLogLevel ( channel . id ) ?? logLevel ;
74
+ entries . push ( { label : channel . label , channel, description : channelLogLevel !== logLevel ? this . getLabel ( channelLogLevel ) : undefined } ) ;
61
75
}
62
76
if ( extensionLogs . length && logs . length ) {
63
77
entries . push ( { type : 'separator' , label : nls . localize ( 'extensionLogs' , "Extension Logs" ) } ) ;
64
78
}
65
79
for ( const channel of extensionLogs . sort ( ( a , b ) => a . label . localeCompare ( b . label ) ) ) {
66
- entries . push ( { label : channel . label , channel } ) ;
80
+ const channelLogLevel = this . logLevelService . getLogLevel ( channel . id ) ?? logLevel ;
81
+ entries . push ( { label : channel . label , channel, description : channelLogLevel !== logLevel ? this . getLabel ( channelLogLevel ) : undefined } ) ;
82
+ }
83
+ const entry = await this . quickInputService . pick ( entries , { placeHolder : nls . localize ( 'selectlog' , "Set Log Level" ) } ) ;
84
+ if ( entry ) {
85
+ if ( ( < LogLevelQuickPickItem > entry ) . level ) {
86
+ return ( < LogLevelQuickPickItem > entry ) . level ;
87
+ }
88
+ if ( ( < LogChannelQuickPickItem > entry ) . channel ) {
89
+ return ( < LogChannelQuickPickItem > entry ) . channel ;
90
+ }
67
91
}
68
- const entry = await this . quickInputService . pick ( entries , { placeHolder : nls . localize ( 'selectlog' , "Select Log" ) } ) ;
69
- return entry ? entry . channel ?? null : undefined ;
92
+ return null ;
70
93
}
71
94
72
- private async selectLogLevel ( logChannel : IOutputChannelDescriptor | null ) : Promise < void > {
95
+ private async setLogLevelForChannel ( logChannel : IOutputChannelDescriptor ) : Promise < void > {
73
96
const defaultLogLevel = this . getDefaultLogLevel ( logChannel ) ;
74
- const current = logChannel ? this . logLevelService . getLogLevel ( logChannel . id ) ?? defaultLogLevel : this . logService . getLevel ( ) ;
75
- const entries = [
76
- { label : this . getLabel ( nls . localize ( 'trace' , "Trace" ) , LogLevel . Trace , current ) , level : LogLevel . Trace , description : this . getDescription ( LogLevel . Trace , defaultLogLevel ) } ,
77
- { label : this . getLabel ( nls . localize ( 'debug' , "Debug" ) , LogLevel . Debug , current ) , level : LogLevel . Debug , description : this . getDescription ( LogLevel . Debug , defaultLogLevel ) } ,
78
- { label : this . getLabel ( nls . localize ( 'info' , "Info" ) , LogLevel . Info , current ) , level : LogLevel . Info , description : this . getDescription ( LogLevel . Info , defaultLogLevel ) } ,
79
- { label : this . getLabel ( nls . localize ( 'warn' , "Warning" ) , LogLevel . Warning , current ) , level : LogLevel . Warning , description : this . getDescription ( LogLevel . Warning , defaultLogLevel ) } ,
80
- { label : this . getLabel ( nls . localize ( 'err' , "Error" ) , LogLevel . Error , current ) , level : LogLevel . Error , description : this . getDescription ( LogLevel . Error , defaultLogLevel ) } ,
81
- { label : this . getLabel ( nls . localize ( 'off' , "Off" ) , LogLevel . Off , current ) , level : LogLevel . Off , description : this . getDescription ( LogLevel . Off , defaultLogLevel ) } ,
82
- ] ;
97
+ const currentLogLevel = this . logLevelService . getLogLevel ( logChannel . id ) ?? defaultLogLevel ;
98
+ const entries = this . getLogLevelEntries ( defaultLogLevel , currentLogLevel ) ;
83
99
84
100
const entry = await this . quickInputService . pick ( entries , { placeHolder : logChannel ? nls . localize ( 'selectLogLevelFor' , " {0}: Select log level" , logChannel ?. label ) : nls . localize ( 'selectLogLevel' , "Select log level" ) , activeItem : entries [ this . logService . getLevel ( ) ] } ) ;
85
101
if ( entry ) {
86
- if ( logChannel ) {
87
- this . logLevelService . setLogLevel ( logChannel . id , entry . level ) ;
88
- } else {
89
- this . logService . setLevel ( entry . level ) ;
90
- }
102
+ this . logLevelService . setLogLevel ( logChannel . id , entry . level ) ;
91
103
}
92
104
}
93
105
94
- private getLabel ( label : string , level : LogLevel , current : LogLevel ) : string {
95
- if ( level === current ) {
96
- return `$(check) ${ label } ` ;
106
+ private getLogLevelEntries ( defaultLogLevel : LogLevel , currentLogLevel : LogLevel ) : LogLevelQuickPickItem [ ] {
107
+ return [
108
+ { label : this . getLabel ( LogLevel . Trace , currentLogLevel ) , level : LogLevel . Trace , description : this . getDescription ( LogLevel . Trace , defaultLogLevel ) } ,
109
+ { label : this . getLabel ( LogLevel . Debug , currentLogLevel ) , level : LogLevel . Debug , description : this . getDescription ( LogLevel . Debug , defaultLogLevel ) } ,
110
+ { label : this . getLabel ( LogLevel . Info , currentLogLevel ) , level : LogLevel . Info , description : this . getDescription ( LogLevel . Info , defaultLogLevel ) } ,
111
+ { label : this . getLabel ( LogLevel . Warning , currentLogLevel ) , level : LogLevel . Warning , description : this . getDescription ( LogLevel . Warning , defaultLogLevel ) } ,
112
+ { label : this . getLabel ( LogLevel . Error , currentLogLevel ) , level : LogLevel . Error , description : this . getDescription ( LogLevel . Error , defaultLogLevel ) } ,
113
+ { label : this . getLabel ( LogLevel . Off , currentLogLevel ) , level : LogLevel . Off , description : this . getDescription ( LogLevel . Off , defaultLogLevel ) } ,
114
+ ] ;
115
+
116
+ }
117
+
118
+ private getLabel ( level : LogLevel , current ?: LogLevel ) : string {
119
+ let label : string ;
120
+ switch ( level ) {
121
+ case LogLevel . Trace : label = nls . localize ( 'trace' , "Trace" ) ; break ;
122
+ case LogLevel . Debug : label = nls . localize ( 'debug' , "Debug" ) ; break ;
123
+ case LogLevel . Info : label = nls . localize ( 'info' , "Info" ) ; break ;
124
+ case LogLevel . Warning : label = nls . localize ( 'warn' , "Warning" ) ; break ;
125
+ case LogLevel . Error : label = nls . localize ( 'err' , "Error" ) ; break ;
126
+ case LogLevel . Off : label = nls . localize ( 'off' , "Off" ) ; break ;
97
127
}
98
- return label ;
128
+ return level === current ? `$(check) ${ label } ` : label ;
99
129
}
100
130
101
131
private getDescription ( level : LogLevel , defaultLogLevel : LogLevel ) : string | undefined {
0 commit comments