import winston from 'winston';
import { randomUUID } from 'crypto';
const { combine, timestamp, printf, colorize, errors } = winston.format;
// Custom format with correlation ID
const logFormat = printf(({ level, message, timestamp, correlationId, stack }) => {
return JSON.stringify({
timestamp,
level,
message,
correlationId,
stack
});
});
// Create logger instance
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: combine(
errors({ stack: true }),
timestamp(),
logFormat
),
defaultMeta: { service: 'mcp-server' },
transports: [
new winston.transports.Console({
format: combine(
colorize(),
timestamp(),
logFormat
)
})
]
});
// Logger with correlation ID support
export const createLogger = (correlationId?: string) => {
return {
info: (message: string, meta?: Record<string, any>) => {
logger.info(message, { correlationId: correlationId || randomUUID(), ...meta });
},
error: (message: string, meta?: Record<string, any>) => {
logger.error(message, { correlationId: correlationId || randomUUID(), ...meta });
},
warn: (message: string, meta?: Record<string, any>) => {
logger.warn(message, { correlationId: correlationId || randomUUID(), ...meta });
},
debug: (message: string, meta?: Record<string, any>) => {
logger.debug(message, { correlationId: correlationId || randomUUID(), ...meta });
}
};
};
export default logger;