import winston from 'winston';
import path from 'path';
/**
* Logger configuration for the logic-thinking project
* Provides structured logging with different levels and contexts
*/
// Define log levels
const levels = {
error: 0,
warn: 1,
info: 2,
debug: 3,
trace: 4
};
// Define colors for each level
const colors = {
error: 'red',
warn: 'yellow',
info: 'green',
debug: 'blue',
trace: 'gray'
};
// Add colors to winston
winston.addColors(colors);
// Create custom format for console output
const consoleFormat = winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.colorize({ all: true }),
winston.format.printf(({ timestamp, level, message, module, ...meta }) => {
const moduleStr = module ? `[${module}]` : '';
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
return `${timestamp} ${level} ${moduleStr}: ${message}${metaStr}`;
})
);
// Create custom format for file output (no colors)
const fileFormat = winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.printf(({ timestamp, level, message, module, ...meta }) => {
const moduleStr = module ? `[${module}]` : '';
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
return `${timestamp} ${level} ${moduleStr}: ${message}${metaStr}`;
})
);
// Create the base logger
const baseLogger = winston.createLogger({
levels,
level: process.env.LOG_LEVEL || 'warn', // Default to 'warn' for MCP operation (only warnings and errors)
transports: [
// Stream transport writing to stderr instead of stdout
// This prevents interference with MCP JSON-RPC protocol
new winston.transports.Stream({
stream: process.stderr,
format: consoleFormat
})
]
});
// Add file transport in production
if (process.env.NODE_ENV === 'production') {
baseLogger.add(new winston.transports.File({
filename: 'logs/error.log',
level: 'error',
format: fileFormat
}));
baseLogger.add(new winston.transports.File({
filename: 'logs/combined.log',
format: fileFormat
}));
}
/**
* Create a logger instance for a specific module
* @param moduleName Name of the module using the logger
* @returns Logger instance with module context
*/
export function createLogger(moduleName: string): winston.Logger {
return baseLogger.child({ module: moduleName });
}
/**
* Logger factory for different systems
*/
export const Loggers = {
// Core systems
syllogistic: createLogger('syllogistic'),
propositional: createLogger('propositional'),
predicate: createLogger('predicate'),
modal: createLogger('modal'),
// Advanced logic systems
systems: {
temporal: createLogger('temporal'),
fuzzy: createLogger('fuzzy'),
deontic: createLogger('deontic')
},
// Validators
validators: {
temporal: createLogger('temporal-validator'),
fuzzy: createLogger('fuzzy-validator'),
deontic: createLogger('deontic-validator')
},
// Mathematical systems
mathematical: createLogger('mathematical'),
advancedMath: createLogger('advanced-math'),
// Parser systems
parser: createLogger('parser'),
mathParser: createLogger('math-parser'),
nlpParser: createLogger('nlp-parser'),
// Visualization systems
visualization: createLogger('visualization'),
truthTable: createLogger('truth-table'),
vennDiagram: createLogger('venn-diagram'),
// Tool systems
tools: createLogger('tools'),
logicTools: createLogger('logic-tools'),
// API and server
api: createLogger('api'),
server: createLogger('server'),
// Manager and cache
manager: createLogger('manager'),
cache: createLogger('cache'),
// General purpose
general: createLogger('general')
};
// Export the base logger for custom usage
export { baseLogger };
// Export winston types for use in other modules
export type Logger = winston.Logger;
export type LogLevel = keyof typeof levels;