@@ -84,6 +84,11 @@ export interface ILogService extends ILogger {
8484
8585export interface ILoggerOptions {
8686
87+ /**
88+ * Id of the logger.
89+ */
90+ id ?: string ;
91+
8792 /**
8893 * Name of the logger.
8994 */
@@ -100,19 +105,31 @@ export interface ILoggerOptions {
100105 donotUseFormatters ?: boolean ;
101106
102107 /**
103- * If set, logger logs the message always.
108+ * When to log. Set to `always` to log always.
109+ */
110+ logLevel ?: 'always' | LogLevel ;
111+
112+ /**
113+ * Whether the log should be hidden from the user.
104114 */
105- always ?: boolean ;
115+ hidden ?: boolean ;
116+
117+ /**
118+ * Id of the extension that created this logger.
119+ */
120+ extensionId ?: string ;
106121}
107122
108123export interface ILoggerResource {
109124 readonly resource : URI ;
125+ readonly id : string ;
110126 readonly name ?: string ;
111- readonly id ?: string ;
112127 readonly logLevel ?: LogLevel ;
128+ readonly hidden ?: boolean ;
129+ readonly extensionId ?: string ;
113130}
114131
115- export type DidChangeLoggerResourceEvent = {
132+ export type DidChangeLoggersEvent = {
116133 readonly added : Iterable < ILoggerResource > ;
117134 readonly removed : Iterable < ILoggerResource > ;
118135} ;
@@ -123,14 +140,21 @@ export interface ILoggerService {
123140
124141 /**
125142 * Creates a logger, or gets one if it already exists.
143+ *
144+ * This will also register the logger with the logger service unless `donotRegister` is set to `true`.
126145 */
127- createLogger ( resource : URI , options ?: ILoggerOptions , logLevel ?: LogLevel ) : ILogger ;
146+ createLogger ( resource : URI , options ?: ILoggerOptions , donotRegister ?: boolean ) : ILogger ;
128147
129148 /**
130149 * Gets an existing logger, if any.
131150 */
132151 getLogger ( resource : URI ) : ILogger | undefined ;
133152
153+ /**
154+ * An event which fires when the log level of a logger has changed
155+ */
156+ readonly onDidChangeLogLevel : Event < [ URI , LogLevel ] > ;
157+
134158 /**
135159 * Set log level for a logger.
136160 */
@@ -142,29 +166,45 @@ export interface ILoggerService {
142166 getLogLevel ( resource : URI ) : LogLevel | undefined ;
143167
144168 /**
145- * An event which fires when the log level of a logger has changed
169+ * An event which fires when the visibility of a logger has changed
170+ */
171+ readonly onDidChangeVisibility : Event < [ URI , boolean ] > ;
172+
173+ /**
174+ * Set the visibility of a logger.
146175 */
147- readonly onDidChangeLogLevel : Event < ILoggerResource > ;
176+ setVisibility ( resource : URI , visible : boolean ) : void ;
148177
149178 /**
150179 * An event which fires when the logger resources are changed
151180 */
152- readonly onDidChangeLoggerResources : Event < DidChangeLoggerResourceEvent > ;
181+ readonly onDidChangeLoggers : Event < DidChangeLoggersEvent > ;
182+
183+ /**
184+ * Register a logger with the logger service.
185+ *
186+ * Note that this will not create a logger, but only register it.
187+ *
188+ * Use `createLogger` to create a logger and register it.
189+ *
190+ * Use it when you want to register a logger that is not created by the logger service.
191+ */
192+ registerLogger ( resource : ILoggerResource ) : void ;
153193
154194 /**
155- * Register the logger resoruce
195+ * Deregister the logger for the given resource.
156196 */
157- registerLoggerResource ( resource : ILoggerResource ) : void ;
197+ deregisterLogger ( resource : URI ) : void ;
158198
159199 /**
160- * Deregister the logger resoruce
200+ * Get all registered loggers
161201 */
162- deregisterLoggerResource ( resource : URI ) : void ;
202+ getRegisteredLoggers ( ) : Iterable < ILoggerResource > ;
163203
164204 /**
165- * Get all registered logger resources
205+ * Get the registered logger for the given resource.
166206 */
167- getLoggerResources ( ) : Iterable < ILoggerResource > ;
207+ getRegisteredLogger ( resource : URI ) : ILoggerResource | undefined ;
168208}
169209
170210export abstract class AbstractLogger extends Disposable implements ILogger {
@@ -532,12 +572,15 @@ export abstract class AbstractLoggerService extends Disposable implements ILogge
532572
533573 private readonly _loggerResources = new ResourceMap < Mutable < ILoggerResource > > ( ) ;
534574
535- private _onDidChangeLoggerResources = this . _register ( new Emitter < { added : ILoggerResource [ ] ; removed : ILoggerResource [ ] } > ) ;
536- readonly onDidChangeLoggerResources = this . _onDidChangeLoggerResources . event ;
575+ private _onDidChangeLoggers = this . _register ( new Emitter < { added : ILoggerResource [ ] ; removed : ILoggerResource [ ] } > ) ;
576+ readonly onDidChangeLoggers = this . _onDidChangeLoggers . event ;
537577
538- private _onDidChangeLogLevel = this . _register ( new Emitter < ILoggerResource > ) ;
578+ private _onDidChangeLogLevel = this . _register ( new Emitter < [ URI , LogLevel ] > ) ;
539579 readonly onDidChangeLogLevel = this . _onDidChangeLogLevel . event ;
540580
581+ private _onDidChangeVisibility = this . _register ( new Emitter < [ URI , boolean ] > ) ;
582+ readonly onDidChangeVisibility = this . _onDidChangeVisibility . event ;
583+
541584 constructor (
542585 protected logLevel : LogLevel ,
543586 onDidChangeLogLevel : Event < LogLevel > ,
@@ -556,13 +599,15 @@ export abstract class AbstractLoggerService extends Disposable implements ILogge
556599 return this . _loggers . get ( resource ) ;
557600 }
558601
559- createLogger ( resource : URI , options ?: ILoggerOptions , logLevel ?: LogLevel ) : ILogger {
602+ createLogger ( resource : URI , options ?: ILoggerOptions , donotRegister ?: boolean ) : ILogger {
560603 let logger = this . _loggers . get ( resource ) ;
561604 if ( ! logger ) {
562- logLevel = options ?. always ? LogLevel . Trace : logLevel ;
605+ const logLevel = options ?. logLevel === ' always' ? LogLevel . Trace : options ?. logLevel ;
563606 logger = this . doCreateLogger ( resource , logLevel ?? this . getLogLevel ( resource ) ?? this . logLevel , options ) ;
564607 this . _loggers . set ( resource , logger ) ;
565- this . registerLoggerResource ( { resource, logLevel, name : options ?. name } ) ;
608+ if ( ! donotRegister ) {
609+ this . registerLogger ( { resource, id : options ?. id ?? resource . toString ( ) , logLevel, name : options ?. name , hidden : options ?. hidden , extensionId : options ?. extensionId } ) ;
610+ }
566611 }
567612 return logger ;
568613 }
@@ -573,7 +618,16 @@ export abstract class AbstractLoggerService extends Disposable implements ILogge
573618 loggerResource . logLevel = logLevel === this . logLevel ? undefined : logLevel ;
574619 this . _loggers . get ( resource ) ?. setLevel ( logLevel ) ;
575620 this . _loggerResources . set ( loggerResource . resource , loggerResource ) ;
576- this . _onDidChangeLogLevel . fire ( loggerResource ) ;
621+ this . _onDidChangeLogLevel . fire ( [ resource , logLevel ] ) ;
622+ }
623+ }
624+
625+ setVisibility ( resource : URI , visibility : boolean ) : void {
626+ const loggerResource = this . _loggerResources . get ( resource ) ;
627+ if ( loggerResource && visibility !== ! loggerResource . hidden ) {
628+ loggerResource . hidden = ! visibility ;
629+ this . _loggerResources . set ( loggerResource . resource , loggerResource ) ;
630+ this . _onDidChangeVisibility . fire ( [ resource , visibility ] ) ;
577631 }
578632 }
579633
@@ -590,26 +644,35 @@ export abstract class AbstractLoggerService extends Disposable implements ILogge
590644 return this . _loggerResources . get ( resource ) ?. logLevel ;
591645 }
592646
593- registerLoggerResource ( resource : ILoggerResource ) : void {
647+ registerLogger ( resource : ILoggerResource ) : void {
594648 const existing = this . _loggerResources . get ( resource . resource ) ;
595649 if ( ! existing ) {
596650 this . _loggerResources . set ( resource . resource , resource ) ;
597- this . _onDidChangeLoggerResources . fire ( { added : [ resource ] , removed : [ ] } ) ;
651+ this . _onDidChangeLoggers . fire ( { added : [ resource ] , removed : [ ] } ) ;
598652 }
599653 }
600654
601- deregisterLoggerResource ( resource : URI ) : void {
655+ deregisterLogger ( resource : URI ) : void {
602656 const existing = this . _loggerResources . get ( resource ) ;
603657 if ( existing ) {
604658 this . _loggerResources . delete ( resource ) ;
605- this . _onDidChangeLoggerResources . fire ( { added : [ ] , removed : [ existing ] } ) ;
659+ const logger = this . _loggers . get ( resource ) ;
660+ if ( logger ) {
661+ this . _loggers . delete ( resource ) ;
662+ logger . dispose ( ) ;
663+ }
664+ this . _onDidChangeLoggers . fire ( { added : [ ] , removed : [ existing ] } ) ;
606665 }
607666 }
608667
609- getLoggerResources ( ) : Iterable < ILoggerResource > {
668+ getRegisteredLoggers ( ) : Iterable < ILoggerResource > {
610669 return this . _loggerResources . values ( ) ;
611670 }
612671
672+ getRegisteredLogger ( resource : URI ) : ILoggerResource | undefined {
673+ return this . _loggerResources . get ( resource ) ;
674+ }
675+
613676 override dispose ( ) : void {
614677 this . _loggers . forEach ( logger => logger . dispose ( ) ) ;
615678 this . _loggers . clear ( ) ;
0 commit comments