UNPKG

@arifwidianto/rpc-agent

Version:

RPC Agent for both client and server, extends more methods easily

99 lines 3.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.logger = exports.Logger = void 0; const interfaces_1 = require("../interfaces"); class Logger { logLevel; logFormat; traceIds; logLevelPriority; constructor(logLevel = interfaces_1.LogLevel.INFO, logFormat = "simple") { this.logLevel = logLevel; this.logFormat = logFormat; this.traceIds = new Map(); this.logLevelPriority = { [interfaces_1.LogLevel.ERROR]: 0, [interfaces_1.LogLevel.WARNING]: 1, [interfaces_1.LogLevel.INFO]: 2, [interfaces_1.LogLevel.DEBUG]: 3, [interfaces_1.LogLevel.VERBOSE]: 4, }; } error(message, metadata = {}) { if (this.shouldLog(interfaces_1.LogLevel.ERROR)) { metadata.level = interfaces_1.LogLevel.ERROR; console.error(this.formatMessage(message, metadata)); } } warning(message, metadata = {}) { if (this.shouldLog(interfaces_1.LogLevel.WARNING)) { metadata.level = interfaces_1.LogLevel.WARNING; console.warn(this.formatMessage(message, metadata)); } } info(message, metadata = {}) { if (this.shouldLog(interfaces_1.LogLevel.INFO)) { metadata.level = interfaces_1.LogLevel.INFO; console.info(this.formatMessage(message, metadata)); } } debug(message, metadata = {}) { if (this.shouldLog(interfaces_1.LogLevel.DEBUG)) { metadata.level = interfaces_1.LogLevel.DEBUG; console.debug(this.formatMessage(message, metadata)); } } verbose(message, metadata = {}) { if (this.shouldLog(interfaces_1.LogLevel.VERBOSE)) { metadata.level = interfaces_1.LogLevel.VERBOSE; console.debug(this.formatMessage(message, metadata)); } } startTrace(message, metadata = {}) { const traceId = Math.random().toString(36).substring(2, 15); this.traceIds.set(traceId, process.hrtime()); metadata.traceId = traceId; this.info(message, metadata); return traceId; } endTrace(traceId, message, metadata = {}) { const start = this.traceIds.get(traceId); if (start) { const [seconds, nanoseconds] = process.hrtime(start); const duration = seconds * 1000 + nanoseconds / 1000000; metadata.traceId = traceId; metadata.duration = `${duration.toFixed(3)}ms`; this.info(message, metadata); this.traceIds.delete(traceId); } } shouldLog(level) { return this.logLevelPriority[level] <= this.logLevelPriority[this.logLevel]; } formatMessage(message, metadata = {}) { const timestamp = new Date().toISOString(); const level = metadata.level || interfaces_1.LogLevel.INFO; const format = metadata.format || this.logFormat; if (format === "simple") { const metaStr = metadata.traceId ? ` [${metadata.traceId}]` : ""; const durationStr = metadata.duration ? ` (${metadata.duration})` : ""; return `[${timestamp}] ${level.toUpperCase()}: ${message}${metaStr}${durationStr}`; } const metadataStr = Object.entries(metadata) .filter(([key]) => !["timestamp", "level", "format"].includes(key)) .map(([key, value]) => `${key}=${this.safeStringify(value)}`) .join(" "); return `[${timestamp}] ${level.toUpperCase()}: ${message} ${metadataStr}`; } safeStringify(value) { try { return typeof value === "object" ? JSON.stringify(value) : String(value); } catch { return "[Circular]"; } } } exports.Logger = Logger; exports.logger = new Logger(process.env.LOG_LEVEL || process.env.LOG_LEVEL || interfaces_1.LogLevel.VERBOSE, process.env.LOG_FORMAT || "detailed"); //# sourceMappingURL=logger.js.map