@454creative/easy-email
Version:
A framework-agnostic email service library for Node.js with observability and monitoring
117 lines • 3.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Logger = exports.LogLevel = void 0;
var LogLevel;
(function (LogLevel) {
LogLevel["DEBUG"] = "debug";
LogLevel["INFO"] = "info";
LogLevel["WARN"] = "warn";
LogLevel["ERROR"] = "error";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
class Logger {
constructor() {
this.logLevel = LogLevel.INFO;
this.logs = [];
this.metrics = {
totalEmailsSent: 0,
successfulEmails: 0,
failedEmails: 0,
averageSendTime: 0,
};
}
static getInstance() {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
setLogLevel(level) {
this.logLevel = level;
}
debug(message, details) {
this.log(LogLevel.DEBUG, message, details);
}
info(message, details) {
this.log(LogLevel.INFO, message, details);
}
warn(message, details) {
this.log(LogLevel.WARN, message, details);
}
error(message, details) {
this.log(LogLevel.ERROR, message, details);
this.metrics.lastError = {
timestamp: new Date().toISOString(),
level: LogLevel.ERROR,
message,
details,
};
}
log(level, message, details) {
if (this.shouldLog(level)) {
const entry = {
timestamp: new Date().toISOString(),
level,
message,
details,
};
this.logs.push(entry);
console.log(`[${entry.timestamp}] ${level.toUpperCase()}: ${message}`, details || '');
}
}
shouldLog(level) {
const levels = Object.values(LogLevel);
return levels.indexOf(level) >= levels.indexOf(this.logLevel);
}
startOperation() {
this.startTime = Date.now();
}
endOperation(success) {
if (this.startTime) {
const duration = Date.now() - this.startTime;
this.metrics.totalEmailsSent++;
if (success) {
this.metrics.successfulEmails++;
}
else {
this.metrics.failedEmails++;
}
this.metrics.averageSendTime =
(this.metrics.averageSendTime * (this.metrics.totalEmailsSent - 1) + duration) /
this.metrics.totalEmailsSent;
this.startTime = undefined;
}
}
getMetrics() {
return Object.assign({}, this.metrics);
}
getLogs(level) {
if (level) {
return this.logs.filter(log => log.level === level);
}
return [...this.logs];
}
clearLogs() {
this.logs = [];
}
resetMetrics() {
this.metrics = {
totalEmailsSent: 0,
successfulEmails: 0,
failedEmails: 0,
averageSendTime: 0,
};
}
/**
* Create a standardized log entry for email operations
* @param operation - The email operation being performed
* @param success - Whether the operation was successful
* @param details - Additional details about the operation
*/
logEmailOperation(operation, success, details) {
const level = success ? LogLevel.INFO : LogLevel.ERROR;
const message = `${operation} ${success ? 'completed successfully' : 'failed'}`;
this.log(level, message, details);
}
}
exports.Logger = Logger;
//# sourceMappingURL=logger.js.map