fortify2-js
Version:
MOST POWERFUL JavaScript Security Library! Military-grade cryptography + 19 enhanced object methods + quantum-resistant algorithms + perfect TypeScript support. More powerful than Lodash with built-in security.
202 lines (199 loc) • 6.27 kB
JavaScript
'use strict';
class Logger {
constructor(config) {
this.config = {
enabled: true,
level: "info",
components: {
server: true,
cache: true,
cluster: true,
performance: true,
fileWatcher: true,
plugins: true,
security: true,
monitoring: true,
routes: true,
userApp: true,
console: false, // Console interception system logs (can be verbose)
},
types: {
startup: true,
warnings: true,
errors: true,
performance: true,
debug: false,
hotReload: true,
portSwitching: true,
},
format: {
timestamps: false,
colors: true,
prefix: true,
compact: false,
},
...config,
};
}
/**
* Get or create singleton instance
*/
static getInstance(config) {
if (!Logger.instance) {
Logger.instance = new Logger(config);
}
else if (config) {
Logger.instance.updateConfig(config);
}
return Logger.instance;
}
/**
* Update logger configuration
*/
updateConfig(config) {
this.config = { ...this.config, ...config };
}
/**
* Check if logging is enabled for a specific component and type
*/
shouldLog(level, component, type) {
// Master switch
if (!this.config?.enabled)
return false;
// Silent mode
// if (this.config?.level === "silent") return false;
// Always show errors unless silent
if (level === "error" &&
this.config?.level &&
this.config?.level !== "silent")
return true;
// Check log level hierarchy
const levels = [
"error",
"warn",
"info",
"debug",
"verbose",
];
const currentLevelIndex = levels.indexOf(this.config?.level);
const messageLevelIndex = levels.indexOf(level);
if (messageLevelIndex > currentLevelIndex)
return false;
// Check component-specific settings
if (this.config?.components &&
this.config?.components[component] === false)
return false;
// Check type-specific settings
if (type && this.config?.types && this.config?.types[type] === false)
return false;
return true;
}
/**
* Format log message
*/
formatMessage(level, component, message) {
let formatted = message;
if (this.config?.format?.prefix && !this.config?.format?.compact) {
const prefix = `[${component.toUpperCase()}]`;
formatted = `${prefix} ${message}`;
}
if (this.config?.format?.timestamps) {
const timestamp = new Date().toISOString();
formatted = `${timestamp} ${formatted}`;
}
if (this.config?.format?.colors &&
level !== "silent" &&
typeof process !== "undefined" &&
process.stdout?.isTTY) {
const colors = {
error: "\x1b[31m", // Red
warn: "\x1b[33m", // Yellow
info: "\x1b[36m", // Cyan
debug: "\x1b[35m", // Magenta
verbose: "\x1b[37m", // White
reset: "\x1b[0m", // Reset
};
const color = colors[level] || colors.info;
formatted = `${color}${formatted}${colors.reset}`;
}
return formatted;
}
/**
* Log a message
*/
log(level, component, type, message, ...args) {
if (!this.shouldLog(level, component, type))
return;
if (this.config?.customLogger) {
this.config?.customLogger(level, component, message, ...args);
return;
}
const formatted = this.formatMessage(level, component, message);
switch (level) {
case "error":
console.error(formatted, ...args);
break;
case "warn":
console.warn(formatted, ...args);
break;
default:
console.log(formatted, ...args);
break;
}
}
// Public logging methods
error(component, message, ...args) {
this.log("error", component, "errors", message, ...args);
}
warn(component, message, ...args) {
this.log("warn", component, "warnings", message, ...args);
}
info(component, message, ...args) {
this.log("info", component, undefined, message, ...args);
}
debug(component, message, ...args) {
this.log("debug", component, "debug", message, ...args);
}
startup(component, message, ...args) {
this.log("info", component, "startup", message, ...args);
}
performance(component, message, ...args) {
this.log("info", component, "performance", message, ...args);
}
hotReload(component, message, ...args) {
this.log("info", component, "hotReload", message, ...args);
}
portSwitching(component, message, ...args) {
this.log("info", component, "portSwitching", message, ...args);
}
securityWarning(message, ...args) {
this.log("warn", "security", "warnings", message, ...args);
}
// Utility methods
isEnabled() {
return this.config?.enabled || false;
}
getLevel() {
return this.config?.level || "info";
}
isComponentEnabled(component) {
return this.config?.components?.[component] !== false;
}
isTypeEnabled(type) {
return this.config?.types?.[type] !== false;
}
}
/**
* Global logger instance
*/
const logger = Logger.getInstance();
/**
* Initialize logger with configuration
*/
function initializeLogger(config) {
return Logger.getInstance(config);
}
exports.Logger = Logger;
exports.initializeLogger = initializeLogger;
exports.logger = logger;
//# sourceMappingURL=Logger.js.map