@@ -158,11 +158,11 @@ public static IChatClient AsSamplingChatClient(this IMcpServer server)
158
158
/// <summary>Gets an <see cref="ILogger"/> on which logged messages will be sent as notifications to the client.</summary>
159
159
/// <param name="server">The server to wrap as an <see cref="ILogger"/>.</param>
160
160
/// <returns>An <see cref="ILogger"/> that can be used to log to the client..</returns>
161
- public static ILogger AsClientLogger ( this IMcpServer server )
161
+ public static ILoggerProvider AsClientLoggerProvider ( this IMcpServer server )
162
162
{
163
163
Throw . IfNull ( server ) ;
164
164
165
- return new ClientLogger ( server ) ;
165
+ return new ClientLoggerProvider ( server ) ;
166
166
}
167
167
168
168
/// <summary>
@@ -224,40 +224,54 @@ void IDisposable.Dispose() { } // nop
224
224
}
225
225
226
226
/// <summary>
227
- /// Provides an <see cref="ILogger "/> implementation for sending logging message notifications
228
- /// to the client for logged messages.
227
+ /// Provides an <see cref="ILoggerProvider "/> implementation for creating loggers
228
+ /// that send logging message notifications to the client for logged messages.
229
229
/// </summary>
230
- private sealed class ClientLogger ( IMcpServer server ) : ILogger
230
+ private sealed class ClientLoggerProvider ( IMcpServer server ) : ILoggerProvider
231
231
{
232
232
/// <inheritdoc />
233
- public IDisposable ? BeginScope < TState > ( TState state ) where TState : notnull =>
234
- null ;
233
+ public ILogger CreateLogger ( string categoryName )
234
+ {
235
+ Throw . IfNull ( categoryName ) ;
235
236
236
- /// <inheritdoc />
237
- public bool IsEnabled ( LogLevel logLevel ) =>
238
- server ? . LoggingLevel is { } loggingLevel &&
239
- McpServer . ToLoggingLevel ( logLevel ) >= loggingLevel ;
237
+ return new ClientLogger ( server , categoryName ) ;
238
+ }
240
239
241
240
/// <inheritdoc />
242
- public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception ? exception , Func < TState , Exception ? , string > formatter )
241
+ void IDisposable . Dispose ( ) { }
242
+
243
+ private sealed class ClientLogger ( IMcpServer server , string categoryName ) : ILogger
243
244
{
244
- if ( ! IsEnabled ( logLevel ) )
245
+ /// <inheritdoc />
246
+ public IDisposable ? BeginScope < TState > ( TState state ) where TState : notnull =>
247
+ null ;
248
+
249
+ /// <inheritdoc />
250
+ public bool IsEnabled ( LogLevel logLevel ) =>
251
+ server ? . LoggingLevel is { } loggingLevel &&
252
+ McpServer . ToLoggingLevel ( logLevel ) >= loggingLevel ;
253
+
254
+ /// <inheritdoc />
255
+ public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception ? exception , Func < TState , Exception ? , string > formatter )
245
256
{
246
- return ;
247
- }
257
+ if ( ! IsEnabled ( logLevel ) )
258
+ {
259
+ return ;
260
+ }
248
261
249
- Throw . IfNull ( formatter ) ;
262
+ Throw . IfNull ( formatter ) ;
250
263
251
- Log ( logLevel , formatter ( state , exception ) ) ;
264
+ Log ( logLevel , formatter ( state , exception ) ) ;
252
265
253
- void Log ( LogLevel logLevel , string message )
254
- {
255
- _ = server . SendNotificationAsync ( NotificationMethods . LoggingMessageNotification , new LoggingMessageNotificationParams ( )
266
+ void Log ( LogLevel logLevel , string message )
256
267
{
257
- Level = McpServer . ToLoggingLevel ( logLevel ) ,
258
- Data = JsonSerializer . SerializeToElement ( message , McpJsonUtilities . JsonContext . Default . String ) ,
259
- Logger = eventId . Name ,
260
- } ) ;
268
+ _ = server . SendNotificationAsync ( NotificationMethods . LoggingMessageNotification , new LoggingMessageNotificationParams ( )
269
+ {
270
+ Level = McpServer . ToLoggingLevel ( logLevel ) ,
271
+ Data = JsonSerializer . SerializeToElement ( message , McpJsonUtilities . JsonContext . Default . String ) ,
272
+ Logger = categoryName ,
273
+ } ) ;
274
+ }
261
275
}
262
276
}
263
277
}
0 commit comments