UNPKG

logstack-zee

Version:

Complete Node.js logging solution with 6 integration methods, S3 bidirectional operations, advanced analytics, and multi-cloud storage support for enterprise-scale applications.

420 lines (353 loc) • 12 kB
#!/usr/bin/env node /** * šŸš€ LogStack Multi-Service CLI * * Start LogStack in different modes: * 1. Embedded (same project) * 2. REST API Service * 3. Kafka Service * 4. Redis Queue Service * 5. RabbitMQ Service * 6. WebSocket Service */ const { LogStackServiceManager } = require("./serviceIntegrations.js"); // CLI Colors const colors = { reset: "\x1b[0m", bright: "\x1b[1m", red: "\x1b[31m", green: "\x1b[32m", yellow: "\x1b[33m", blue: "\x1b[34m", magenta: "\x1b[35m", cyan: "\x1b[36m", }; function colorize(text, color) { return `${colors[color]}${text}${colors.reset}`; } function showBanner() { console.log( colorize("\n╔════════════════════════════════════════════╗", "cyan") ); console.log( colorize("ā•‘ šŸš€ LogStack Multi-Service CLI ā•‘", "cyan") ); console.log( colorize("ā•‘ Choose Your Integration Method ā•‘", "cyan") ); console.log( colorize("ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•", "cyan") ); } function showHelp() { showBanner(); console.log("\nšŸ“‹ Available Service Options:\n"); console.log(colorize("1ļøāƒ£ Embedded Mode (Same Project)", "yellow")); console.log(" ā”œā”€ Direct integration in your existing codebase"); console.log(" ā”œā”€ No separate service needed"); console.log(' └─ Usage: require("logstack") in your code\n'); console.log(colorize("2ļøāƒ£ REST API Service", "yellow")); console.log(" ā”œā”€ HTTP endpoints for external applications"); console.log(" ā”œā”€ Authentication & rate limiting included"); console.log(" └─ Command: node multi-service-cli.js api --port 4000\n"); console.log(colorize("3ļøāƒ£ Kafka Message Service", "yellow")); console.log(" ā”œā”€ Event-driven log processing"); console.log(" ā”œā”€ High throughput & scalability"); console.log( " └─ Command: node multi-service-cli.js kafka --brokers localhost:9092\n" ); console.log(colorize("4ļøāƒ£ Redis Queue Service", "yellow")); console.log(" ā”œā”€ Simple queue-based processing"); console.log(" ā”œā”€ Fast in-memory operations"); console.log( " └─ Command: node multi-service-cli.js redis --url redis://localhost:6379\n" ); console.log(colorize("5ļøāƒ£ RabbitMQ Service", "yellow")); console.log(" ā”œā”€ Reliable message queuing"); console.log(" ā”œā”€ Advanced routing & persistence"); console.log( " └─ Command: node multi-service-cli.js rabbitmq --url amqp://localhost\n" ); console.log(colorize("6ļøāƒ£ WebSocket Service", "yellow")); console.log(" ā”œā”€ Real-time bidirectional communication"); console.log(" ā”œā”€ Live log streaming"); console.log( " └─ Command: node multi-service-cli.js websocket --port 8080\n" ); console.log(colorize("šŸŽÆ Multi-Service Mode", "yellow")); console.log(" ā”œā”€ Run multiple services simultaneously"); console.log(" ā”œā”€ Load balancing & redundancy"); console.log(" └─ Command: node multi-service-cli.js multi\n"); console.log(colorize("āš™ļø Common Options:", "blue")); console.log(" --database MongoDB connection string"); console.log(" --storage Storage provider (aws, local)"); console.log(" --collection MongoDB collection name"); console.log(" --config Config file path\n"); console.log(colorize("šŸ“– Examples:", "green")); console.log( " node multi-service-cli.js api --port 4000 --database mongodb://localhost:27017/logs" ); console.log( " node multi-service-cli.js kafka --brokers localhost:9092,localhost:9093" ); console.log( " node multi-service-cli.js redis --url redis://localhost:6379" ); console.log( " node multi-service-cli.js multi --services api,kafka,redis\n" ); } function parseArgs() { const args = process.argv.slice(2); const command = args[0]; const options = {}; for (let i = 1; i < args.length; i += 2) { if (args[i].startsWith("--")) { const key = args[i].substring(2); const value = args[i + 1]; options[key] = value; } } return { command, options }; } function getLogStackConfig(options) { return { database: options.database || process.env.LOGSTACK_DATABASE || "mongodb://localhost:27017/logstack", storage: options.storage || process.env.LOGSTACK_STORAGE || "local", collection: options.collection || process.env.LOGSTACK_COLLECTION || "api_logs", }; } async function startApiService(options) { console.log(colorize("šŸš€ Starting REST API Service...", "green")); const LogStackServer = require("../server.js"); const server = new LogStackServer({ port: options.port || 4000, logstack: getLogStackConfig(options), }); await server.start(); console.log( colorize( `āœ… REST API Service running on port ${options.port || 4000}`, "green" ) ); } async function startKafkaService(options) { console.log(colorize("šŸš€ Starting Kafka Service...", "green")); const { KafkaLogStackService } = require("./serviceIntegrations.js"); const brokers = options.brokers ? options.brokers.split(",") : ["localhost:9092"]; const service = new KafkaLogStackService({ brokers, logstack: getLogStackConfig(options), }); await service.start(); console.log( colorize( `āœ… Kafka Service running with brokers: ${brokers.join(", ")}`, "green" ) ); } async function startRedisService(options) { console.log(colorize("šŸš€ Starting Redis Queue Service...", "green")); const { RedisLogStackService } = require("./serviceIntegrations.js"); const service = new RedisLogStackService({ redis: { url: options.url || "redis://localhost:6379" }, logstack: getLogStackConfig(options), }); await service.start(); console.log( colorize( `āœ… Redis Service running on ${options.url || "redis://localhost:6379"}`, "green" ) ); } async function startRabbitMQService(options) { console.log(colorize("šŸš€ Starting RabbitMQ Service...", "green")); const { RabbitMQLogStackService } = require("./serviceIntegrations.js"); const service = new RabbitMQLogStackService({ rabbitmq: options.url || "amqp://localhost", logstack: getLogStackConfig(options), }); await service.start(); console.log( colorize( `āœ… RabbitMQ Service running on ${options.url || "amqp://localhost"}`, "green" ) ); } async function startWebSocketService(options) { console.log(colorize("šŸš€ Starting WebSocket Service...", "green")); const { WebSocketLogStackService } = require("./serviceIntegrations.js"); const service = new WebSocketLogStackService({ port: options.port || 8080, logstack: getLogStackConfig(options), }); service.start(); console.log( colorize( `āœ… WebSocket Service running on port ${options.port || 8080}`, "green" ) ); } async function startMultiService(options) { console.log(colorize("šŸš€ Starting Multi-Service Mode...", "green")); const manager = new LogStackServiceManager(); const services = options.services ? options.services.split(",") : ["api", "redis"]; for (const serviceType of services) { try { switch (serviceType.trim()) { case "api": await manager.startService("api", { port: options.apiPort || 4000, logstack: getLogStackConfig(options), }); break; case "kafka": await manager.startService("kafka", { brokers: options.brokers ? options.brokers.split(",") : ["localhost:9092"], logstack: getLogStackConfig(options), }); break; case "redis": await manager.startService("redis", { redis: { url: options.redisUrl || "redis://localhost:6379" }, logstack: getLogStackConfig(options), }); break; case "rabbitmq": await manager.startService("rabbitmq", { rabbitmq: options.rabbitmqUrl || "amqp://localhost", logstack: getLogStackConfig(options), }); break; case "websocket": await manager.startService("websocket", { port: options.wsPort || 8080, logstack: getLogStackConfig(options), }); break; } } catch (error) { console.log( colorize(`āŒ Failed to start ${serviceType}: ${error.message}`, "red") ); } } console.log( colorize( `āœ… Multi-Service Mode running with: ${services.join(", ")}`, "green" ) ); // Handle graceful shutdown process.on("SIGINT", async () => { console.log(colorize("\nšŸ›‘ Shutting down services...", "yellow")); await manager.stopAll(); process.exit(0); }); } function showEmbeddedExample() { console.log(colorize("\nšŸ“¦ Embedded Mode Example:", "yellow")); console.log(colorize("────────────────────────────", "blue")); const example = ` // Install: npm install logstack const LogStack = require('logstack'); // Initialize const logger = new LogStack({ database: 'mongodb://localhost:27017/myapp', collection: 'api_logs', storage: 'local' // or 'aws' }); // Use in your application app.use(async (req, res, next) => { // Your API logic here // Log the request await logger.saveLogs([{ endpoint: req.path, method: req.method, status: res.statusCode, timestamp: new Date(), responseTime: Date.now() - req.startTime }]); next(); }); // Process logs periodically setInterval(async () => { await logger.processJobs(); }, 60000); // Every minute `; console.log(colorize(example, "white")); } async function main() { const { command, options } = parseArgs(); if ( !command || command === "help" || command === "--help" || command === "-h" ) { showHelp(); return; } try { switch (command) { case "embedded": showEmbeddedExample(); break; case "api": await startApiService(options); break; case "kafka": await startKafkaService(options); break; case "redis": await startRedisService(options); break; case "rabbitmq": await startRabbitMQService(options); break; case "websocket": await startWebSocketService(options); break; case "multi": await startMultiService(options); break; default: console.log(colorize(`āŒ Unknown command: ${command}`, "red")); console.log( colorize('šŸ’” Use "help" to see available options', "yellow") ); } } catch (error) { console.log(colorize(`āŒ Error: ${error.message}`, "red")); process.exit(1); } // Keep process alive for services if (command !== "embedded" && command !== "help") { console.log( colorize("\nšŸŽÆ Service is running... Press Ctrl+C to stop", "cyan") ); process.on("SIGINT", () => { console.log(colorize("\nšŸ‘‹ Goodbye!", "green")); process.exit(0); }); } } if (require.main === module) { main().catch(console.error); } module.exports = { main, showHelp, showEmbeddedExample };