@@ -8,6 +8,7 @@ export type LogLevel = LoggingMessageNotification["params"]["level"];
8
8
9
9
abstract class LoggerBase {
10
10
abstract log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void ;
11
+
11
12
info ( id : MongoLogId , context : string , message : string ) : void {
12
13
this . log ( "info" , id , context , message ) ;
13
14
}
@@ -47,22 +48,35 @@ class ConsoleLogger extends LoggerBase {
47
48
}
48
49
}
49
50
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 ) {
55
53
super ( ) ;
56
54
}
57
55
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
+
58
75
log ( level : LogLevel , id : MongoLogId , context : string , message : string ) : void {
59
76
message = redact ( message ) ;
60
77
const mongoDBLevel = this . mapToMongoDBLogLevel ( level ) ;
78
+
61
79
this . logWriter [ mongoDBLevel ] ( "MONGODB-MCP" , id , context , message ) ;
62
- void this . server . server . sendLoggingMessage ( {
63
- level,
64
- data : `[${ context } ]: ${ message } ` ,
65
- } ) ;
66
80
}
67
81
68
82
private mapToMongoDBLogLevel ( level : LogLevel ) : "info" | "warn" | "error" | "debug" | "fatal" {
@@ -86,31 +100,56 @@ class Logger extends LoggerBase {
86
100
}
87
101
}
88
102
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
+ }
91
137
92
138
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
+ }
94
142
}
95
143
}
96
144
97
- const logger = new ProxyingLogger ( ) ;
145
+ const logger = new CompositeLogger ( ) ;
98
146
export default logger ;
99
147
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 ) ;
111
151
112
- await manager . cleanupOldLogFiles ( ) ;
152
+ logger . setLoggers ( mcpLogger , diskLogger ) ;
113
153
114
- const logWriter = await manager . createLogWriter ( ) ;
115
- logger [ "internalLogger" ] = new Logger ( logWriter , server ) ;
154
+ return logger ;
116
155
}
0 commit comments