File size: 3,272 Bytes
b190b45 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
/**
* Logger Utility
* Controls console output based on environment and log level
*/
class Logger {
constructor() {
this.enabled = true;
this.level = this.getLogLevel();
this.prefix = '';
}
/**
* Get log level from localStorage or default to 'info' (balanced visibility)
* @returns {string} Log level: 'debug', 'info', 'warn', 'error', 'silent'
*/
getLogLevel() {
if (typeof localStorage === 'undefined') return 'info';
// Default to 'info' for better debugging, but allow override
// Users can set to 'warn' or 'error' to reduce noise if needed
return localStorage.getItem('logLevel') || 'info';
}
/**
* Set log level
* @param {string} level - Log level
*/
setLevel(level) {
this.level = level;
if (typeof localStorage !== 'undefined') {
localStorage.setItem('logLevel', level);
}
}
/**
* Check if level should be logged
* @param {string} level - Log level to check
* @returns {boolean}
*/
shouldLog(level) {
if (!this.enabled) return false;
if (this.level === 'silent') return false;
const levels = ['debug', 'info', 'warn', 'error'];
const currentIndex = levels.indexOf(this.level);
const checkIndex = levels.indexOf(level);
return checkIndex >= currentIndex;
}
/**
* Format log message
* @param {string} prefix - Component prefix
* @param {string} message - Log message
* @returns {string}
*/
formatMessage(prefix, message) {
return prefix ? `[${prefix}] ${message}` : message;
}
/**
* Debug log
* @param {string} prefix - Component prefix
* @param {...any} args - Log arguments
*/
debug(prefix, ...args) {
if (!this.shouldLog('debug')) return;
const message = this.formatMessage(prefix, args[0]);
console.debug(message, ...args.slice(1));
}
/**
* Info log
* @param {string} prefix - Component prefix
* @param {...any} args - Log arguments
*/
info(prefix, ...args) {
if (!this.shouldLog('info')) return;
const message = this.formatMessage(prefix, args[0]);
console.log(message, ...args.slice(1));
}
/**
* Warn log
* @param {string} prefix - Component prefix
* @param {...any} args - Log arguments
*/
warn(prefix, ...args) {
if (!this.shouldLog('warn')) return;
const message = this.formatMessage(prefix, args[0]);
console.warn(message, ...args.slice(1));
}
/**
* Error log (always shown unless silent)
* @param {string} prefix - Component prefix
* @param {...any} args - Log arguments
*/
error(prefix, ...args) {
if (!this.shouldLog('error')) return;
const message = this.formatMessage(prefix, args[0]);
console.error(message, ...args.slice(1));
}
/**
* Disable all logging
*/
disable() {
this.enabled = false;
}
/**
* Enable logging
*/
enable() {
this.enabled = true;
}
}
// Create singleton instance
const logger = new Logger();
// Expose to window for debugging
if (typeof window !== 'undefined') {
window.logger = logger;
window.setLogLevel = (level) => logger.setLevel(level);
}
export default logger;
|