/**
* Logger
*
* Structured JSON logging utility for Cloudflare Workers.
* Provides consistent logging across all components.
*/
/**
* Logger Class
*/
export class Logger {
constructor() {
this.level = this.getLogLevel();
this.levels = {
debug: 0,
info: 1,
warn: 2,
error: 3
};
}
/**
* Get log level from environment
* @returns {string} Log level
*/
getLogLevel() {
if (typeof globalThis !== 'undefined' && globalThis.ENV && globalThis.ENV.LOG_LEVEL) {
return globalThis.ENV.LOG_LEVEL.toLowerCase();
}
return 'info';
}
/**
* Check if level should be logged
* @param {string} level - Log level
* @returns {boolean}
*/
shouldLog(level) {
return this.levels[level] >= this.levels[this.level];
}
/**
* Format log entry
* @param {string} level - Log level
* @param {string} message - Log message
* @param {Object} data - Additional data
* @returns {Object} Formatted log entry
*/
formatLogEntry(level, message, data = {}) {
return {
level,
message,
timestamp: new Date().toISOString(),
environment: typeof globalThis !== 'undefined' && globalThis.ENV ? globalThis.ENV.ENVIRONMENT : 'unknown',
...data
};
}
/**
* Write log to console
* @param {string} level - Log level
* @param {Object} entry - Log entry
*/
writeLog(level, entry) {
const message = JSON.stringify(entry);
switch (level) {
case 'debug':
console.debug(message);
break;
case 'info':
console.log(message);
break;
case 'warn':
console.warn(message);
break;
case 'error':
console.error(message);
break;
default:
console.log(message);
}
}
/**
* Log debug message
* @param {string} message - Log message
* @param {Object} data - Additional data
*/
debug(message, data) {
if (this.shouldLog('debug')) {
const entry = this.formatLogEntry('debug', message, data);
this.writeLog('debug', entry);
}
}
/**
* Log info message
* @param {string} message - Log message
* @param {Object} data - Additional data
*/
info(message, data) {
if (this.shouldLog('info')) {
const entry = this.formatLogEntry('info', message, data);
this.writeLog('info', entry);
}
}
/**
* Log warning message
* @param {string} message - Log message
* @param {Object} data - Additional data
*/
warn(message, data) {
if (this.shouldLog('warn')) {
const entry = this.formatLogEntry('warn', message, data);
this.writeLog('warn', entry);
}
}
/**
* Log error message
* @param {string} message - Log message
* @param {Object} data - Additional data
*/
error(message, data) {
if (this.shouldLog('error')) {
const entry = this.formatLogEntry('error', message, data);
this.writeLog('error', entry);
}
}
/**
* Set log level
* @param {string} level - New log level
*/
setLevel(level) {
if (this.levels.hasOwnProperty(level)) {
this.level = level;
}
}
/**
* Get current log level
* @returns {string} Current log level
*/
getLevel() {
return this.level;
}
}
// Export singleton instance
export const logger = new Logger();