@@ -60,21 +60,19 @@ interface LogPayload {
60
60
export type LoggerType = "console" | "disk" | "mcp" ;
61
61
62
62
export abstract class LoggerBase {
63
- abstract log ( level : LogLevel , payload : Omit < LogPayload , "noRedaction" > ) : void ;
64
-
65
- abstract type : LoggerType | null ;
66
-
67
- private logCore ( level : LogLevel , payload : LogPayload ) {
68
- // Default to not redacting mcp logs, redact everything else
63
+ public log ( level : LogLevel , payload : LogPayload ) : void {
69
64
const noRedaction = payload . noRedaction !== undefined ? payload . noRedaction : "mcp" ;
70
65
71
- this . log ( level , {
72
- id : payload . id ,
73
- context : payload . context ,
66
+ this . logCore ( level , {
67
+ ...payload ,
74
68
message : this . redactIfNecessary ( payload . message , noRedaction ) ,
75
69
} ) ;
76
70
}
77
71
72
+ protected abstract type : LoggerType ;
73
+
74
+ protected abstract logCore ( level : LogLevel , payload : LogPayload ) : void ;
75
+
78
76
private redactIfNecessary ( message : string , noRedaction : LogPayload [ "noRedaction" ] ) : string {
79
77
if ( typeof noRedaction === "boolean" && noRedaction ) {
80
78
// If the consumer has supplied noRedaction: true, we don't redact the log message
@@ -135,9 +133,9 @@ export abstract class LoggerBase {
135
133
}
136
134
137
135
export class ConsoleLogger extends LoggerBase {
138
- type : LoggerType = "console" ;
136
+ protected type : LoggerType = "console" ;
139
137
140
- log ( level : LogLevel , payload : LogPayload ) : void {
138
+ protected logCore ( level : LogLevel , payload : LogPayload ) : void {
141
139
const { id, context, message } = payload ;
142
140
console . error ( `[${ level . toUpperCase ( ) } ] ${ id . __value } - ${ context } : ${ message } (${ process . pid } )` ) ;
143
141
}
@@ -148,7 +146,7 @@ export class DiskLogger extends LoggerBase {
148
146
super ( ) ;
149
147
}
150
148
151
- type : LoggerType = "disk" ;
149
+ protected type : LoggerType = "disk" ;
152
150
153
151
static async fromPath ( logPath : string ) : Promise < DiskLogger > {
154
152
await fs . mkdir ( logPath , { recursive : true } ) ;
@@ -169,7 +167,7 @@ export class DiskLogger extends LoggerBase {
169
167
return new DiskLogger ( logWriter ) ;
170
168
}
171
169
172
- log ( level : LogLevel , payload : LogPayload ) : void {
170
+ protected logCore ( level : LogLevel , payload : LogPayload ) : void {
173
171
const { id, context, message } = payload ;
174
172
const mongoDBLevel = this . mapToMongoDBLogLevel ( level ) ;
175
173
@@ -204,7 +202,7 @@ export class McpLogger extends LoggerBase {
204
202
205
203
type : LoggerType = "mcp" ;
206
204
207
- log ( level : LogLevel , payload : LogPayload ) : void {
205
+ protected logCore ( level : LogLevel , payload : LogPayload ) : void {
208
206
// Only log if the server is connected
209
207
if ( ! this . server ?. isConnected ( ) ) {
210
208
return ;
@@ -218,7 +216,8 @@ export class McpLogger extends LoggerBase {
218
216
}
219
217
220
218
class CompositeLogger extends LoggerBase {
221
- type : LoggerType | null = null ;
219
+ // This is not a real logger type - it should not be used anyway.
220
+ protected type : LoggerType = "composite" as unknown as LoggerType ;
222
221
223
222
private loggers : LoggerBase [ ] = [ ] ;
224
223
@@ -235,11 +234,16 @@ class CompositeLogger extends LoggerBase {
235
234
this . loggers = [ ...loggers ] ;
236
235
}
237
236
238
- log ( level : LogLevel , payload : LogPayload ) : void {
237
+ public log ( level : LogLevel , payload : LogPayload ) : void {
238
+ // Override the public method to avoid the base logger redacting the message payload
239
239
for ( const logger of this . loggers ) {
240
240
logger . log ( level , payload ) ;
241
241
}
242
242
}
243
+
244
+ protected logCore ( ) : void {
245
+ throw new Error ( "logCore should never be invoked on CompositeLogger" ) ;
246
+ }
243
247
}
244
248
245
249
const logger = new CompositeLogger ( new ConsoleLogger ( ) ) ;
0 commit comments