@contiva/sap-integration-suite-client
Version:
SAP Cloud Platform Integration API Client
135 lines (134 loc) • 4.24 kB
JavaScript
;
/**
* Structured logging utility for cache operations
*
* Provides structured logging with log levels (INFO, DEBUG, WARN, ERROR)
* and support for metrics (counts, durations, etc.)
*
* @module cache-logger
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.cacheLogger = exports.LogLevel = void 0;
/**
* Log levels
*/
var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
LogLevel[LogLevel["INFO"] = 1] = "INFO";
LogLevel[LogLevel["WARN"] = 2] = "WARN";
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
/**
* Structured logger for cache operations
*/
class CacheLogger {
constructor() {
this.debugMode = process.env.DEBUG === 'true';
this.config = {
minLevel: this.debugMode ? LogLevel.DEBUG : LogLevel.INFO,
enableStructured: true,
enableConsole: true,
};
}
/**
* Logs a message with the specified level
*/
log(level, message, context, metrics, error) {
if (level < this.config.minLevel) {
return;
}
const entry = {
level,
message,
context,
metrics,
error,
timestamp: Date.now(),
};
// Console output (backward compatible)
if (this.config.enableConsole) {
this.logToConsole(entry);
}
// Structured output (JSON format)
if (this.config.enableStructured && this.shouldLogStructured(level)) {
this.logStructured(entry);
}
}
/**
* Logs to console in a human-readable format (backward compatible)
*/
logToConsole(entry) {
const prefix = entry.context ? `[${entry.context}]` : '[CacheLogger]';
const metricsStr = entry.metrics ? ` ${JSON.stringify(entry.metrics)}` : '';
const errorStr = entry.error ? ` Error: ${entry.error.message}` : '';
switch (entry.level) {
case LogLevel.DEBUG:
console.debug(`${prefix} ${entry.message}${metricsStr}${errorStr}`);
break;
case LogLevel.INFO:
console.log(`${prefix} ${entry.message}${metricsStr}${errorStr}`);
break;
case LogLevel.WARN:
console.warn(`${prefix} ${entry.message}${metricsStr}${errorStr}`);
break;
case LogLevel.ERROR:
console.error(`${prefix} ${entry.message}${metricsStr}${errorStr}`, entry.error || '');
break;
}
}
/**
* Logs structured output (JSON format)
*/
logStructured(entry) {
const levelName = LogLevel[entry.level];
const structured = {
level: levelName,
message: entry.message,
context: entry.context,
...entry.metrics,
timestamp: new Date(entry.timestamp).toISOString(),
...(entry.error && {
error: {
message: entry.error.message,
stack: entry.error.stack,
},
}),
};
// Output as JSON (can be parsed by log aggregation tools)
console.log(JSON.stringify(structured));
}
/**
* Determines if structured logging should be used for this level
*/
shouldLogStructured(level) {
// Only log structured for INFO and above (DEBUG is too verbose)
return level >= LogLevel.INFO;
}
/**
* Logs a DEBUG message
*/
debug(message, context, metrics) {
this.log(LogLevel.DEBUG, message, context, metrics);
}
/**
* Logs an INFO message with optional metrics
*/
info(message, context, metrics) {
this.log(LogLevel.INFO, message, context, metrics);
}
/**
* Logs a WARN message
*/
warn(message, context, metrics) {
this.log(LogLevel.WARN, message, context, metrics);
}
/**
* Logs an ERROR message
*/
error(message, context, metrics, error) {
this.log(LogLevel.ERROR, message, context, metrics, error);
}
}
// Export singleton instance
exports.cacheLogger = new CacheLogger();