@varia-bly/variably-sdk
Version:
Official JavaScript/TypeScript SDK for Variably feature flags, experimentation, and real-time dynamic configurations
179 lines • 4.92 kB
JavaScript
;
/**
* 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