Skip to content

Commit de1b5a4

Browse files
authored
refactor: split loggers (#111)
1 parent 77513d9 commit de1b5a4

File tree

1 file changed

+66
-27
lines changed

1 file changed

+66
-27
lines changed

src/logger.ts

Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export type LogLevel = LoggingMessageNotification["params"]["level"];
88

99
abstract 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();
98146
export 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

Comments
 (0)