UNPKG

@varia-bly/variably-sdk

Version:

Official JavaScript/TypeScript SDK for Variably feature flags, experimentation, and real-time dynamic configurations

179 lines 4.92 kB
"use strict"; /** * Logging utilities for Variably SDK */ Object.defineProperty(exports, "__esModule", { value: true }); exports.StructuredLogger = exports.CustomLogger = exports.SilentLogger = exports.ConsoleLogger = void 0; exports.createLogger = createLogger; exports.getLogLevelFromEnv = getLogLevelFromEnv; /** * Console-based logger implementation */ class ConsoleLogger { constructor(level = 'info') { this.levelPriority = { debug: 0, info: 1, warn: 2, error: 3 }; this.level = level; } debug(message, meta) { this.log('debug', message, meta); } info(message, meta) { this.log('info', message, meta); } warn(message, meta) { this.log('warn', message, meta); } error(message, meta) { this.log('error', message, meta); } setLevel(level) { this.level = level; } log(level, message, meta) { if (this.levelPriority[level] < this.levelPriority[this.level]) { return; } const timestamp = new Date().toISOString(); const logMessage = `[${timestamp}] [${level.toUpperCase()}] [Variably] ${message}`; const consoleMethod = level === 'error' ? console.error : level === 'warn' ? console.warn : level === 'debug' ? console.debug : console.log; if (meta && Object.keys(meta).length > 0) { consoleMethod(logMessage, meta); } else { consoleMethod(logMessage); } } } exports.ConsoleLogger = ConsoleLogger; /** * Silent logger that discards all log messages */ class SilentLogger { debug() { } info() { } warn() { } error() { } setLevel() { } } exports.SilentLogger = SilentLogger; /** * Custom logger that allows injecting your own logging function */ class CustomLogger { constructor(logFunction, level = 'info') { this.levelPriority = { debug: 0, info: 1, warn: 2, error: 3 }; this.logFunction = logFunction; this.level = level; } debug(message, meta) { this.log('debug', message, meta); } info(message, meta) { this.log('info', message, meta); } warn(message, meta) { this.log('warn', message, meta); } error(message, meta) { this.log('error', message, meta); } setLevel(level) { this.level = level; } log(level, message, meta) { if (this.levelPriority[level] < this.levelPriority[this.level]) { return; } this.logFunction(level, message, meta); } } exports.CustomLogger = CustomLogger; /** * Structured logger that formats logs as JSON */ class StructuredLogger { constructor(level = 'info', service = 'variably-sdk') { this.levelPriority = { debug: 0, info: 1, warn: 2, error: 3 }; this.level = level; this.service = service; } debug(message, meta) { this.log('debug', message, meta); } info(message, meta) { this.log('info', message, meta); } warn(message, meta) { this.log('warn', message, meta); } error(message, meta) { this.log('error', message, meta); } setLevel(level) { this.level = level; } log(level, message, meta) { if (this.levelPriority[level] < this.levelPriority[this.level]) { return; } const logEntry = { timestamp: new Date().toISOString(), level: level.toUpperCase(), service: this.service, message, ...meta }; const consoleMethod = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log; consoleMethod(JSON.stringify(logEntry)); } } exports.StructuredLogger = StructuredLogger; /** * Factory function to create appropriate logger based on environment */ function createLogger(options) { const { level = 'info', type = 'console', custom } = options || {}; switch (type) { case 'silent': return new SilentLogger(); case 'structured': return new StructuredLogger(level); case 'console': default: if (custom) { return new CustomLogger(custom, level); } return new ConsoleLogger(level); } } /** * Get appropriate log level from environment variable */ function getLogLevelFromEnv(defaultLevel = 'info') { const envLevel = typeof process !== 'undefined' && process.env?.VARIABLY_LOG_LEVEL; if (envLevel && ['debug', 'info', 'warn', 'error'].includes(envLevel)) { return envLevel; } return defaultLevel; } //# sourceMappingURL=logger.js.map