strogger
Version:
📊 A modern structured logging library with functional programming, duck-typing, and comprehensive third-party integrations
248 lines (247 loc) • 9.8 kB
JavaScript
;
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