UNPKG

strogger

Version:

📊 A modern structured logging library with functional programming, duck-typing, and comprehensive third-party integrations

248 lines (247 loc) • 9.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.runAllErrorExamples = exports.demonstrateErrorRecovery = exports.demonstrateClearErrorMessages = exports.demonstrateTransportAPIErrors = exports.demonstrateEnvironmentErrors = exports.demonstrateLoggerErrors = exports.demonstrateNewRelicErrors = void 0; const index_1 = require("../index"); // Example 1: Missing New Relic Environment Variables const demonstrateNewRelicErrors = () => { console.log("=== New Relic Transport Error Examples ===\n"); try { // This will fail because NEW_RELIC_LICENSE_KEY is not set const { createNewRelicTransport, } = require("../transports/newrelic-transport"); const newRelicTransport = createNewRelicTransport(); const logger = (0, index_1.createLogger)({ config: { serviceName: "error-example" }, transports: [newRelicTransport], formatter: (0, index_1.createJsonFormatter)(), env: (0, index_1.getEnvironment)(), }); logger.info("This won't work"); } catch (error) { console.log("Expected Error (Missing API Key):"); console.log("Error:", error.message); console.log("Solution: Set NEW_RELIC_LICENSE_KEY environment variable"); console.log("Example: NEW_RELIC_LICENSE_KEY=your-license-key-here\n"); } try { // This will fail because NEW_RELIC_ACCOUNT_ID is not set process.env.NEW_RELIC_LICENSE_KEY = "fake-key"; const { createNewRelicTransport, } = require("../transports/newrelic-transport"); const newRelicTransport = createNewRelicTransport(); const logger = (0, index_1.createLogger)({ config: { serviceName: "error-example" }, transports: [newRelicTransport], formatter: (0, index_1.createJsonFormatter)(), env: (0, index_1.getEnvironment)(), }); logger.info("This won't work either"); } catch (error) { console.log("Expected Error (Missing Account ID):"); console.log("Error:", error.message); console.log("Solution: Set NEW_RELIC_ACCOUNT_ID environment variable"); console.log("Example: NEW_RELIC_ACCOUNT_ID=your-account-id-here\n"); } // Clean up delete process.env.NEW_RELIC_LICENSE_KEY; }; exports.demonstrateNewRelicErrors = demonstrateNewRelicErrors; // Example 2: Invalid Logger Configuration const demonstrateLoggerErrors = () => { console.log("=== Logger Configuration Error Examples ===\n"); try { // This will fail because formatter is missing const logger = (0, index_1.createLogger)({ config: { serviceName: "error-example" }, transports: [(0, index_1.createConsoleTransport)()], // formatter: createJsonFormatter(), // Missing formatter env: (0, index_1.getEnvironment)(), }); logger.info("This won't work"); } catch (error) { console.log("Expected Error (Missing Formatter):"); console.log("Error:", error.message); console.log( "Solution: Provide a formatter object with a format(entry) method", ); console.log("Example: formatter: createJsonFormatter()\n"); } try { // This will fail because transport is invalid const logger = (0, index_1.createLogger)({ config: { serviceName: "error-example" }, transports: [{ invalid: "transport" }], formatter: (0, index_1.createJsonFormatter)(), env: (0, index_1.getEnvironment)(), }); logger.info("This won't work"); } catch (error) { console.log("Expected Error (Invalid Transport):"); console.log("Error:", error.message); console.log("Solution: Each transport must have a log(entry) method"); console.log("Example: transport: { log: (entry) => console.log(entry) }\n"); } }; exports.demonstrateLoggerErrors = demonstrateLoggerErrors; // Example 3: Environment Variable Errors const demonstrateEnvironmentErrors = () => { console.log("=== Environment Variable Error Examples ===\n"); try { // This will show environment validation issues const originalEnv = { ...process.env }; // Remove important environment variables delete process.env.SERVICE_NAME; delete process.env.STAGE; const env = (0, index_1.getEnvironment)(); console.log("Environment validation warnings:"); console.log("- Missing SERVICE_NAME (using default)"); console.log("- Missing STAGE (using 'dev')\n"); // Restore environment process.env = originalEnv; } catch (error) { console.log("Environment Error:", error.message); console.log( "Solution: Check your environment variables and configuration\n", ); } }; exports.demonstrateEnvironmentErrors = demonstrateEnvironmentErrors; // Example 4: Transport API Errors const demonstrateTransportAPIErrors = () => { console.log("=== Transport API Error Examples ===\n"); try { // This will fail because the API endpoint is invalid process.env.NEW_RELIC_LICENSE_KEY = "fake-key"; process.env.NEW_RELIC_ACCOUNT_ID = "fake-account"; const { createNewRelicTransport, } = require("../transports/newrelic-transport"); const newRelicTransport = createNewRelicTransport({ region: "invalid-region", // This will cause API errors }); const logger = (0, index_1.createLogger)({ config: { serviceName: "api-error-example" }, transports: [newRelicTransport], formatter: (0, index_1.createJsonFormatter)(), env: (0, index_1.getEnvironment)(), }); logger.info("This will cause API errors"); // Clean up delete process.env.NEW_RELIC_LICENSE_KEY; delete process.env.NEW_RELIC_ACCOUNT_ID; } catch (error) { console.log("Expected API Error:"); console.log("Error:", error.message); console.log( "Solution: Check your API credentials and network connectivity", ); console.log( "Note: Transport errors are handled gracefully and logged to console\n", ); } }; exports.demonstrateTransportAPIErrors = demonstrateTransportAPIErrors; // Example 5: Clear Error Messages in Action const demonstrateClearErrorMessages = () => { console.log("=== Clear Error Messages in Action ===\n"); const errorScenarios = [ { name: "Missing New Relic API Key", description: "User tries to use New Relic transport without API key", error: "New Relic transport requires NEW_RELIC_LICENSE_KEY environment variable (New Relic)", solution: "Set NEW_RELIC_LICENSE_KEY in your environment variables or pass apiKey option", example: "NEW_RELIC_LICENSE_KEY=your-license-key-here", }, { name: "Invalid Formatter", description: "User provides invalid formatter object", error: "Formatter must have a format(entry) method", solution: "Provide a formatter object with a format(entry) method", example: "formatter: { format: (entry) => JSON.stringify(entry) }", }, { name: "Invalid Transport", description: "User provides transport without log method", error: "Transport at index 0 must have a log(entry) method", solution: "Each transport must have a log(entry) method", example: "transport: { log: (entry) => console.log(entry) }", }, { name: "Missing Service Name", description: "User doesn't provide service name", error: "Logger configuration requires serviceName", solution: "Set SERVICE_NAME environment variable or provide serviceName in config", example: "SERVICE_NAME=my-service", }, ]; errorScenarios.forEach((scenario, index) => { console.log(`${index + 1}. ${scenario.name}`); console.log(` Description: ${scenario.description}`); console.log(` Error: ${scenario.error}`); console.log(` Solution: ${scenario.solution}`); console.log(` Example: ${scenario.example}\n`); }); }; exports.demonstrateClearErrorMessages = demonstrateClearErrorMessages; // Example 6: Error Recovery and Fallbacks const demonstrateErrorRecovery = () => { console.log("=== Error Recovery and Fallbacks ===\n"); // Create a logger with multiple transports const logger = (0, index_1.createLogger)({ config: { serviceName: "recovery-example" }, transports: [ // Console transport (always works) (0, index_1.createConsoleTransport)({ level: index_1.LogLevel.DEBUG }), // Custom transport that might fail { log: async (entry) => { // Simulate intermittent failures if (Math.random() > 0.7) { throw new Error("Simulated transport failure"); } console.log(`[CUSTOM] ${JSON.stringify(entry)}`); }, setLevel: (level) => console.log(`Setting custom transport level to ${level}`), getLevel: () => index_1.LogLevel.INFO, }, ], formatter: (0, index_1.createJsonFormatter)(), env: (0, index_1.getEnvironment)(), }); console.log("Testing error recovery with multiple transports:"); console.log("- Console transport should always work"); console.log("- Custom transport will fail randomly"); console.log("- Logger continues to function despite transport failures\n"); // Send multiple log messages for (let i = 1; i <= 5; i++) { logger.info(`Test message ${i}`, { testId: i }); } console.log( "\nNote: Transport errors are logged to console but don't stop the logger", ); }; exports.demonstrateErrorRecovery = demonstrateErrorRecovery; // Run all examples const runAllErrorExamples = () => { (0, exports.demonstrateNewRelicErrors)(); (0, exports.demonstrateLoggerErrors)(); (0, exports.demonstrateEnvironmentErrors)(); (0, exports.demonstrateTransportAPIErrors)(); (0, exports.demonstrateClearErrorMessages)(); (0, exports.demonstrateErrorRecovery)(); }; exports.runAllErrorExamples = runAllErrorExamples; //# sourceMappingURL=error-handling-example.js.map