mem100x
Version:
⚡ The FASTEST MCP memory server ever built - 66k+ entities/sec with intelligent context detection
167 lines • 5.62 kB
JavaScript
;
/**
* 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