@arifwidianto/rpc-agent
Version:
RPC Agent for both client and server, extends more methods easily
99 lines • 3.99 kB
JavaScript
;
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