@@ -50,44 +50,95 @@ export const LogId = {
5050 streamableHttpTransportCloseFailure : mongoLogId ( 1_006_006 ) ,
5151} as const ;
5252
53+ interface LogPayload {
54+ id : MongoLogId ;
55+ context : string ;
56+ message : string ;
57+ noRedaction ?: boolean | LoggerType | LoggerType [ ] ;
58+ }
59+
60+ export type LoggerType = "console" | "disk" | "mcp" ;
61+
5362export abstract class LoggerBase {
54- abstract log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void ;
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
69+ const noRedaction = payload . noRedaction !== undefined ? payload . noRedaction : "mcp" ;
70+
71+ this . log ( level , {
72+ id : payload . id ,
73+ context : payload . context ,
74+ message : this . redactIfNecessary ( payload . message , noRedaction ) ,
75+ } ) ;
76+ }
77+
78+ private redactIfNecessary ( message : string , noRedaction : LogPayload [ "noRedaction" ] ) : string {
79+ if ( typeof noRedaction === "boolean" && noRedaction ) {
80+ // If the consumer has supplied noRedaction: true, we don't redact the log message
81+ // regardless of the logger type
82+ return message ;
83+ }
5584
56- info ( id : MongoLogId , context : string , message : string ) : void {
57- this . log ( "info" , id , context , message ) ;
85+ if ( typeof noRedaction === "string" && noRedaction === this . type ) {
86+ // If the consumer has supplied noRedaction: logger-type, we skip redacting if
87+ // our logger type is the same as what the consumer requested
88+ return message ;
89+ }
90+
91+ if (
92+ typeof noRedaction === "object" &&
93+ Array . isArray ( noRedaction ) &&
94+ this . type !== null &&
95+ noRedaction . indexOf ( this . type ) !== - 1
96+ ) {
97+ // If the consumer has supplied noRedaction: array, we skip redacting if our logger
98+ // type is included in that array
99+ return message ;
100+ }
101+
102+ return redact ( message ) ;
103+ }
104+
105+ info ( payload : LogPayload ) : void {
106+ this . log ( "info" , payload ) ;
58107 }
59108
60- error ( id : MongoLogId , context : string , message : string ) : void {
61- this . log ( "error" , id , context , message ) ;
109+ error ( payload : LogPayload ) : void {
110+ this . log ( "error" , payload ) ;
62111 }
63- debug ( id : MongoLogId , context : string , message : string ) : void {
64- this . log ( "debug" , id , context , message ) ;
112+ debug ( payload : LogPayload ) : void {
113+ this . log ( "debug" , payload ) ;
65114 }
66115
67- notice ( id : MongoLogId , context : string , message : string ) : void {
68- this . log ( "notice" , id , context , message ) ;
116+ notice ( payload : LogPayload ) : void {
117+ this . log ( "notice" , payload ) ;
69118 }
70119
71- warning ( id : MongoLogId , context : string , message : string ) : void {
72- this . log ( "warning" , id , context , message ) ;
120+ warning ( payload : LogPayload ) : void {
121+ this . log ( "warning" , payload ) ;
73122 }
74123
75- critical ( id : MongoLogId , context : string , message : string ) : void {
76- this . log ( "critical" , id , context , message ) ;
124+ critical ( payload : LogPayload ) : void {
125+ this . log ( "critical" , payload ) ;
77126 }
78127
79- alert ( id : MongoLogId , context : string , message : string ) : void {
80- this . log ( "alert" , id , context , message ) ;
128+ alert ( payload : LogPayload ) : void {
129+ this . log ( "alert" , payload ) ;
81130 }
82131
83- emergency ( id : MongoLogId , context : string , message : string ) : void {
84- this . log ( "emergency" , id , context , message ) ;
132+ emergency ( payload : LogPayload ) : void {
133+ this . log ( "emergency" , payload ) ;
85134 }
86135}
87136
88137export class ConsoleLogger extends LoggerBase {
89- log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void {
90- message = redact ( message ) ;
138+ type : LoggerType = "console" ;
139+
140+ log ( level : LogLevel , payload : LogPayload ) : void {
141+ const { id, context, message } = payload ;
91142 console . error ( `[${ level . toUpperCase ( ) } ] ${ id . __value } - ${ context } : ${ message } (${ process . pid } )` ) ;
92143 }
93144}
@@ -97,6 +148,8 @@ export class DiskLogger extends LoggerBase {
97148 super ( ) ;
98149 }
99150
151+ type : LoggerType = "disk" ;
152+
100153 static async fromPath ( logPath : string ) : Promise < DiskLogger > {
101154 await fs . mkdir ( logPath , { recursive : true } ) ;
102155
@@ -116,8 +169,8 @@ export class DiskLogger extends LoggerBase {
116169 return new DiskLogger ( logWriter ) ;
117170 }
118171
119- log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void {
120- message = redact ( message ) ;
172+ log ( level : LogLevel , payload : LogPayload ) : void {
173+ const { id , context , message } = payload ;
121174 const mongoDBLevel = this . mapToMongoDBLogLevel ( level ) ;
122175
123176 this . logWriter [ mongoDBLevel ] ( "MONGODB-MCP" , id , context , message ) ;
@@ -149,20 +202,24 @@ export class McpLogger extends LoggerBase {
149202 super ( ) ;
150203 }
151204
152- log ( level : LogLevel , _ : MongoLogId , context : string , message : string ) : void {
205+ type : LoggerType = "mcp" ;
206+
207+ log ( level : LogLevel , payload : LogPayload ) : void {
153208 // Only log if the server is connected
154209 if ( ! this . server ?. isConnected ( ) ) {
155210 return ;
156211 }
157212
158213 void this . server . server . sendLoggingMessage ( {
159214 level,
160- data : `[${ context } ]: ${ message } ` ,
215+ data : `[${ payload . context } ]: ${ payload . message } ` ,
161216 } ) ;
162217 }
163218}
164219
165220class CompositeLogger extends LoggerBase {
221+ type : LoggerType | null = null ;
222+
166223 private loggers : LoggerBase [ ] = [ ] ;
167224
168225 constructor ( ...loggers : LoggerBase [ ] ) {
@@ -178,9 +235,9 @@ class CompositeLogger extends LoggerBase {
178235 this . loggers = [ ...loggers ] ;
179236 }
180237
181- log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void {
238+ log ( level : LogLevel , payload : LogPayload ) : void {
182239 for ( const logger of this . loggers ) {
183- logger . log ( level , id , context , message ) ;
240+ logger . log ( level , payload ) ;
184241 }
185242 }
186243}
0 commit comments