@@ -8,6 +8,7 @@ export type LogLevel = LoggingMessageNotification["params"]["level"];
88
99abstract class LoggerBase {
1010 abstract log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void ;
11+
1112 info ( id : MongoLogId , context : string , message : string ) : void {
1213 this . log ( "info" , id , context , message ) ;
1314 }
@@ -47,22 +48,35 @@ class ConsoleLogger extends LoggerBase {
4748 }
4849}
4950
50- class Logger extends LoggerBase {
51- constructor (
52- private logWriter : MongoLogWriter ,
53- private server : McpServer
54- ) {
51+ class DiskLogger extends LoggerBase {
52+ private constructor ( private logWriter : MongoLogWriter ) {
5553 super ( ) ;
5654 }
5755
56+ static async fromPath ( logPath : string ) : Promise < DiskLogger > {
57+ await fs . mkdir ( logPath , { recursive : true } ) ;
58+
59+ const manager = new MongoLogManager ( {
60+ directory : logPath ,
61+ retentionDays : 30 ,
62+ onwarn : console . warn ,
63+ onerror : console . error ,
64+ gzip : false ,
65+ retentionGB : 1 ,
66+ } ) ;
67+
68+ await manager . cleanupOldLogFiles ( ) ;
69+
70+ const logWriter = await manager . createLogWriter ( ) ;
71+
72+ return new DiskLogger ( logWriter ) ;
73+ }
74+
5875 log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void {
5976 message = redact ( message ) ;
6077 const mongoDBLevel = this . mapToMongoDBLogLevel ( level ) ;
78+
6179 this . logWriter [ mongoDBLevel ] ( "MONGODB-MCP" , id , context , message ) ;
62- void this . server . server . sendLoggingMessage ( {
63- level,
64- data : `[${ context } ]: ${ message } ` ,
65- } ) ;
6680 }
6781
6882 private mapToMongoDBLogLevel ( level : LogLevel ) : "info" | "warn" | "error" | "debug" | "fatal" {
@@ -86,31 +100,56 @@ class Logger extends LoggerBase {
86100 }
87101}
88102
89- class ProxyingLogger extends LoggerBase {
90- private internalLogger : LoggerBase = new ConsoleLogger ( ) ;
103+ class McpLogger extends LoggerBase {
104+ constructor ( private server : McpServer ) {
105+ super ( ) ;
106+ }
107+
108+ log ( level : LogLevel , _ : MongoLogId , context : string , message : string ) : void {
109+ void this . server . server . sendLoggingMessage ( {
110+ level,
111+ data : `[${ context } ]: ${ message } ` ,
112+ } ) ;
113+ }
114+ }
115+
116+ class CompositeLogger extends LoggerBase {
117+ private loggers : LoggerBase [ ] ;
118+
119+ constructor ( ...loggers : LoggerBase [ ] ) {
120+ super ( ) ;
121+
122+ if ( loggers . length === 0 ) {
123+ // default to ConsoleLogger
124+ this . loggers = [ new ConsoleLogger ( ) ] ;
125+ return ;
126+ }
127+
128+ this . loggers = [ ...loggers ] ;
129+ }
130+
131+ setLoggers ( ...loggers : LoggerBase [ ] ) : void {
132+ if ( loggers . length === 0 ) {
133+ throw new Error ( "At least one logger must be provided" ) ;
134+ }
135+ this . loggers = [ ...loggers ] ;
136+ }
91137
92138 log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void {
93- this . internalLogger . log ( level , id , context , message ) ;
139+ for ( const logger of this . loggers ) {
140+ logger . log ( level , id , context , message ) ;
141+ }
94142 }
95143}
96144
97- const logger = new ProxyingLogger ( ) ;
145+ const logger = new CompositeLogger ( ) ;
98146export default logger ;
99147
100- export async function initializeLogger ( server : McpServer , logPath : string ) : Promise < void > {
101- await fs . mkdir ( logPath , { recursive : true } ) ;
102-
103- const manager = new MongoLogManager ( {
104- directory : logPath ,
105- retentionDays : 30 ,
106- onwarn : console . warn ,
107- onerror : console . error ,
108- gzip : false ,
109- retentionGB : 1 ,
110- } ) ;
148+ export async function initializeLogger ( server : McpServer , logPath : string ) : Promise < LoggerBase > {
149+ const diskLogger = await DiskLogger . fromPath ( logPath ) ;
150+ const mcpLogger = new McpLogger ( server ) ;
111151
112- await manager . cleanupOldLogFiles ( ) ;
152+ logger . setLoggers ( mcpLogger , diskLogger ) ;
113153
114- const logWriter = await manager . createLogWriter ( ) ;
115- logger [ "internalLogger" ] = new Logger ( logWriter , server ) ;
154+ return logger ;
116155}
0 commit comments