UNPKG

mem100x

Version:

⚡ The FASTEST MCP memory server ever built - 66k+ entities/sec with intelligent context detection

167 lines 5.62 kB
"use strict"; /** * Structured logging configuration using Winston * Provides performance tracking, error logging, and debugging capabilities */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.logWarn = exports.logDebug = exports.logInfo = exports.logCacheHit = exports.logQuery = exports.logPerf = exports.logError = exports.logger = exports.PerformanceTracker = void 0; const winston_1 = __importDefault(require("winston")); const path_1 = require("path"); const fs_1 = require("fs"); const config_js_1 = require("../config.js"); // Ensure logs directory exists const logsDir = (0, path_1.join)(process.cwd(), 'logs'); (0, fs_1.mkdirSync)(logsDir, { recursive: true }); // Custom log levels const customLevels = { levels: { error: 0, warn: 1, info: 2, perf: 3, // Performance metrics debug: 4, trace: 5 // Detailed trace logs }, colors: { error: 'red', warn: 'yellow', info: 'green', perf: 'cyan', debug: 'blue', trace: 'magenta' } }; // Create custom format for structured logging const structuredFormat = winston_1.default.format.combine(winston_1.default.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }), winston_1.default.format.errors({ stack: true }), winston_1.default.format.json()); // Console format for development const consoleFormat = winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.timestamp({ format: 'HH:mm:ss.SSS' }), winston_1.default.format.printf(({ timestamp, level, message, ...meta }) => { const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : ''; return `[${timestamp}] ${level}: ${message}${metaStr}`; })); // Create logger instance const logger = winston_1.default.createLogger({ levels: customLevels.levels, level: config_js_1.config.logging.level, format: structuredFormat, defaultMeta: { service: 'mem100x', pid: process.pid }, transports: [ // Write all logs to combined.log new winston_1.default.transports.File({ filename: (0, path_1.join)(logsDir, 'combined.log'), maxsize: 10 * 1024 * 1024, // 10MB maxFiles: 5, tailable: true }), // Write errors to separate file new winston_1.default.transports.File({ filename: (0, path_1.join)(logsDir, 'error.log'), level: 'error', maxsize: 10 * 1024 * 1024, maxFiles: 5 }), // Write performance logs to separate file new winston_1.default.transports.File({ filename: (0, path_1.join)(logsDir, 'performance.log'), level: 'perf', maxsize: 10 * 1024 * 1024, maxFiles: 5, format: winston_1.default.format.combine(structuredFormat, winston_1.default.format((info) => { return info.level === 'perf' ? info : false; })()) }) ] }); exports.logger = logger; // Add console transport if not in production if (process.env.NODE_ENV !== 'production') { logger.add(new winston_1.default.transports.Console({ format: consoleFormat, level: config_js_1.config.logging.level })); } // Add colors winston_1.default.addColors(customLevels.colors); // Performance tracking helper class PerformanceTracker { startTime; operation; metadata; constructor(operation, metadata = {}) { this.startTime = performance.now(); this.operation = operation; this.metadata = metadata; } end(additionalMetadata = {}) { const duration = performance.now() - this.startTime; logger.log('perf', `${this.operation} completed`, { operation: this.operation, duration: duration.toFixed(3), durationMs: duration, ...this.metadata, ...additionalMetadata }); } } exports.PerformanceTracker = PerformanceTracker; // Convenience methods const logError = (message, error, metadata) => { logger.error(message, { error: error.message, stack: error.stack, ...metadata }); }; exports.logError = logError; const logPerf = (operation, duration, metadata) => { logger.log('perf', `${operation} performance`, { operation, duration: duration.toFixed(3), durationMs: duration, opsPerSec: Math.round(1000 / duration), ...metadata }); }; exports.logPerf = logPerf; const logQuery = (query, duration, rowCount, metadata) => { logger.log('perf', 'Database query', { query: query.substring(0, 100), // Truncate long queries duration: duration.toFixed(3), durationMs: duration, rowCount, rowsPerSec: Math.round(rowCount / (duration / 1000)), ...metadata }); }; exports.logQuery = logQuery; const logCacheHit = (cache, key, hit) => { logger.debug('Cache access', { cache, key, hit, result: hit ? 'HIT' : 'MISS' }); }; exports.logCacheHit = logCacheHit; const logInfo = (message, metadata) => { logger.info(message, metadata); }; exports.logInfo = logInfo; const logDebug = (message, metadata) => { logger.debug(message, metadata); }; exports.logDebug = logDebug; const logWarn = (message, metadata) => { logger.warn(message, metadata); }; exports.logWarn = logWarn; //# sourceMappingURL=logger.js.map