// @ts-check
/**
* @category Tools
* @classdesc
* A simple and customizable logger class for JavaScript applications.
* It allows enabling/disabling specific log levels independently.
* Supports debug, info, warn, and error logging with console output.
*
* * @example
* // Basic usage with defaults (all levels enabled)
* const logger = new Logger();
* logger.debug('This is a debug message');
* logger.info('This is an info message');
* logger.warn('This is a warning');
* logger.error('This is an error');
*
* @example
* // Customizing levels (e.g., hide debug and info for production-like behavior)
* const logger = new Logger({ debug: false, info: false });
* logger.debug('This won\'t show');
* logger.info('This won\'t show');
* logger.warn('This will show');
* logger.error('This will show');
*
* @example
* // Environment-based instantiation
* const isDev = process.env.NODE_ENV !== 'production';
* const logger = new Logger({
* debug: isDev,
* info: isDev,
* warn: true,
* error: true
* });
*
* @example
* // Dynamic level changes
* const logger = new Logger();
* logger.setLevels({ warn: false });
* logger.warn('This won\'t show now');
*
* @since 11.2025, aab
*
*/
export class Logger {
/**
* Constructor for the Logger class.
* @param {Object} [options={}] - Customize which levels to show (true/false for each).
* Defaults: { debug: true, info: true, warn: true, error: true }
* Example: { debug: false, info: false } to hide debug and info.
* @param {boolean} [options.debug=true] - Enable debug logs.
* @param {boolean} [options.info=true] - Enable info logs.
* @param {boolean} [options.warn=true] - Enable warn logs.
* @param {boolean} [options.error=true] - Enable error logs.
*/
constructor(options = {}) {
/** @type {{ debug: boolean, info: boolean, warn: boolean, error: boolean }} */
this.levels = {
debug: options.debug !== false, // Default true, but customizable
info: options.info !== false, // Default true
warn: options.warn !== false, // Default true
error: options.error !== false // Default true
};
}
/**
* Logs debug information (if enabled).
* @param {...any} args - Arguments to log.
*/
debug(...args) {
if (this.levels.debug) {
console.log('[DEBUG]', ...args);
}
}
/**
* Logs general information (if enabled).
* @param {...any} args - Arguments to log.
*/
info(...args) {
if (this.levels.info) {
console.log('[INFO]', ...args);
}
}
/**
* Logs warnings (if enabled, with warn in console).
* @param {...any} args - Arguments to log.
*/
warn(...args) {
if (this.levels.warn) {
console.warn('[WARN]', ...args);
}
}
/**
* Logs errors (if enabled, with error in console).
* @param {...any} args - Arguments to log.
*/
error(...args) {
if (this.levels.error) {
console.error('[ERROR]', ...args);
}
}
/**
* Update levels dynamically.
* @param {Object} newOptions - Same as constructor options.
* @param {boolean} [newOptions.debug] - Update debug level.
* @param {boolean} [newOptions.info] - Update info level.
* @param {boolean} [newOptions.warn] - Update warn level.
* @param {boolean} [newOptions.error] - Update error level.
*/
setLevels(newOptions) {
Object.assign(this.levels, {
debug: newOptions.debug !== false,
info: newOptions.info !== false,
warn: newOptions.warn !== false,
error: newOptions.error !== false
});
}
}
Source