diff --git a/dist/elasticlog.classes.elasticlog.d.ts b/dist/elasticlog.classes.elasticlog.d.ts index f76842b..2905fa3 100644 --- a/dist/elasticlog.classes.elasticlog.d.ts +++ b/dist/elasticlog.classes.elasticlog.d.ts @@ -1,11 +1,12 @@ -export declare type Environment = 'local' | 'test' | 'staging' | 'production'; -import { Client as ElasticClient } from 'elasticsearch'; +export declare type Environment = "local" | "test" | "staging" | "production"; +import { Client as ElasticClient } from "elasticsearch"; +import { LogScheduler } from "./elasticlog.classes.logscheduler"; export interface LogContext { zone?: string; containerName?: string; environment: Environment; } -export declare type TLogSeverity = 'log' | 'info' | 'warn' | 'error' | 'fatal'; +export declare type TLogSeverity = "log" | "info" | "warn" | "error" | "fatal"; export interface IStandardLogParams { message: string; severity: string; @@ -32,9 +33,5 @@ export declare class ElasticLog { * @param optionsArg */ private computeHostString(optionsArg); - log(logObject: IStandardLogParams): void; -} -export declare class LogScheduler { - logStorage: any[]; - addFailedLog(objectArg: any | IStandardLogParams): void; + log(logObject: IStandardLogParams, scheduleOverwrite?: boolean): Promise; } diff --git a/dist/elasticlog.classes.elasticlog.js b/dist/elasticlog.classes.elasticlog.js index cb70a0c..87367ff 100644 --- a/dist/elasticlog.classes.elasticlog.js +++ b/dist/elasticlog.classes.elasticlog.js @@ -1,21 +1,30 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; Object.defineProperty(exports, "__esModule", { value: true }); // interfaces const elasticsearch_1 = require("elasticsearch"); +// other classes +const elasticlog_classes_logscheduler_1 = require("./elasticlog.classes.logscheduler"); class ElasticLog { /** * sets up an instance of Elastic log * @param optionsArg */ constructor(optionsArg) { - this.logScheduler = new LogScheduler(); + this.logScheduler = new elasticlog_classes_logscheduler_1.LogScheduler(this); this.logContext = optionsArg.logContext; this.client = new elasticsearch_1.Client({ host: this.computeHostString(optionsArg), - log: 'trace' + log: "trace" }); } - ; /** * computes the host string from the constructor options * @param optionsArg @@ -33,31 +42,35 @@ class ElasticLog { } return hostString; } - log(logObject) { - const now = new Date(); - this.client.index({ - index: `logs-${now.getFullYear()}.${("0" + (now.getMonth() + 1)).slice(-2)}.${now.getDate()}`, - type: 'log', - body: { - '@timestamp': now.toISOString(), - container: this.logContext.containerName, - environment: this.logContext.environment, - severity: logObject.severity, - message: logObject.message - } - }, (error, response) => { - if (error) { - console.log(error); - this.logScheduler.addFailedLog(logObject); + log(logObject, scheduleOverwrite = false) { + return __awaiter(this, void 0, void 0, function* () { + const now = new Date(); + if (this.logScheduler.logsScheduled && !scheduleOverwrite) { + this.logScheduler.scheduleLog(logObject); + return; } + this.client.index({ + index: `logs-${now.getFullYear()}.${("0" + (now.getMonth() + 1)).slice(-2)}.${now.getDate()}`, + type: "log", + body: { + "@timestamp": now.toISOString(), + container: this.logContext.containerName, + environment: this.logContext.environment, + severity: logObject.severity, + message: logObject.message + } + }, (error, response) => { + if (error) { + console.log("ElasticLog encountered an error:"); + console.log(error); + this.logScheduler.addFailedLog(logObject); + } + else { + console.log(`ElasticLog: ${logObject.message}`); + } + }); }); } } exports.ElasticLog = ElasticLog; -; -class LogScheduler { - addFailedLog(objectArg) { - } -} -exports.LogScheduler = LogScheduler; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLmVsYXN0aWNsb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lbGFzdGljbG9nLmNsYXNzZXMuZWxhc3RpY2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGFBQWE7QUFDYixpREFBdUQ7QUF3QnZEO0lBS0U7OztPQUdHO0lBQ0gsWUFBYSxVQUF5QztRQU50RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7UUFPL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxzQkFBYSxDQUFDO1lBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDO1lBQ3hDLEdBQUcsRUFBRSxPQUFPO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFBLENBQUM7SUFFRjs7O09BR0c7SUFDSyxpQkFBaUIsQ0FBQyxVQUF5QztRQUNqRSxJQUFJLFVBQVUsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNELEVBQUUsQ0FBQSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEMsVUFBVSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3BFLENBQUM7UUFDRCxFQUFFLENBQUEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixVQUFVLEdBQUcsV0FBVyxVQUFVLEVBQUUsQ0FBQTtRQUN0QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixVQUFVLEdBQUcsVUFBVSxVQUFVLEVBQUUsQ0FBQTtRQUNyQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsR0FBRyxDQUFDLFNBQTZCO1FBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDaEIsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdGLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFO2dCQUNKLFlBQVksRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFO2dCQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO2dCQUN4QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUN4QyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7Z0JBQzVCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTzthQUMzQjtTQUNGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDckIsRUFBRSxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0NBRUY7QUF0REQsZ0NBc0RDO0FBQUEsQ0FBQztBQUVGO0lBRUUsWUFBWSxDQUFDLFNBQW1DO0lBRWhELENBQUM7Q0FDRjtBQUxELG9DQUtDIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLmVsYXN0aWNsb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lbGFzdGljbG9nLmNsYXNzZXMuZWxhc3RpY2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBRUEsYUFBYTtBQUNiLGlEQUF3RDtBQUd4RCxnQkFBZ0I7QUFDaEIsdUZBQWlFO0FBd0JqRTtJQUtFOzs7T0FHRztJQUNILFlBQVksVUFBeUM7UUFOckQsaUJBQVksR0FBRyxJQUFJLDhDQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFPcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxzQkFBYSxDQUFDO1lBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDO1lBQ3hDLEdBQUcsRUFBRSxPQUFPO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLFVBQXlDO1FBQ2pFLElBQUksVUFBVSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0QsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QyxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7UUFDckUsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFVBQVUsR0FBRyxXQUFXLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLFVBQVUsR0FBRyxVQUFVLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFSyxHQUFHLENBQUMsU0FBNkIsRUFBRSxpQkFBaUIsR0FBRyxLQUFLOztZQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekMsTUFBTSxDQUFDO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmO2dCQUNFLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDcEUsQ0FBQyxDQUFDLENBQ0gsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxLQUFLO2dCQUNYLElBQUksRUFBRTtvQkFDSixZQUFZLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRTtvQkFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtvQkFDeEMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVztvQkFDeEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO29CQUM1QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87aUJBQzNCO2FBQ0YsRUFDRCxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDbEIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7b0JBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztLQUFBO0NBQ0Y7QUFqRUQsZ0NBaUVDIn0= \ No newline at end of file diff --git a/dist/elasticlog.classes.logscheduler.d.ts b/dist/elasticlog.classes.logscheduler.d.ts new file mode 100644 index 0000000..32474f0 --- /dev/null +++ b/dist/elasticlog.classes.logscheduler.d.ts @@ -0,0 +1,11 @@ +import { ElasticLog, IStandardLogParams } from "./elasticlog.classes.elasticlog"; +export declare class LogScheduler { + elasticLogRef: ElasticLog; + logsScheduled: boolean; + logStorage: any[]; + constructor(elasticLogRefArg: ElasticLog); + addFailedLog(objectArg: any | IStandardLogParams): void; + scheduleLog(logObject: any): void; + setRetry(): void; + deferSend(): void; +} diff --git a/dist/elasticlog.classes.logscheduler.js b/dist/elasticlog.classes.logscheduler.js new file mode 100644 index 0000000..3b01fec --- /dev/null +++ b/dist/elasticlog.classes.logscheduler.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class LogScheduler { + constructor(elasticLogRefArg) { + this.logsScheduled = false; + this.logStorage = []; + this.elasticLogRef = elasticLogRefArg; + } + addFailedLog(objectArg) { + this.logStorage.push(objectArg); + this.setRetry(); + } + scheduleLog(logObject) { + this.logStorage.push(logObject); + } + setRetry() { + setTimeout(() => { + const oldStorage = this.logStorage; + this.logStorage = []; + for (let logObject of oldStorage) { + this.elasticLogRef.log(logObject, true); + } + if (this.logStorage.length === 0) { + console.log("ElasticLog retry success!!!"); + this.logsScheduled = false; + } + else { + console.log("ElasticLog retry failed"); + this.setRetry(); + } + }, 5000); + } + deferSend() { + if (!this.logsScheduled) { + console.log("Retry ElasticLog in 5 seconds!"); + this.logsScheduled = true; + this.setRetry(); + } + } +} +exports.LogScheduler = LogScheduler; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLmxvZ3NjaGVkdWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2VsYXN0aWNsb2cuY2xhc3Nlcy5sb2dzY2hlZHVsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQTtJQUtFLFlBQVksZ0JBQWlDO1FBSDdDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFHckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztJQUN4QyxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQW1DO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0QsV0FBVyxDQUFDLFNBQWM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFFBQVE7UUFDTixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsQ0FBQyxJQUFJLFNBQVMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDN0IsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsU0FBUztRQUNQLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBekNELG9DQXlDQyJ9 \ No newline at end of file diff --git a/dist/elasticlog.classes.winstontransport.d.ts b/dist/elasticlog.classes.winstontransport.d.ts new file mode 100644 index 0000000..85e43a8 --- /dev/null +++ b/dist/elasticlog.classes.winstontransport.d.ts @@ -0,0 +1,11 @@ +import { Transport } from "winston-transport"; +import { ElasticLog, IElasticLogConstructorOptions } from "./elasticlog.classes.elasticlog"; +export interface IWinstonStandardLogParams { + message: string; + level: string; +} +export declare class ElasticWinstonTransport extends Transport { + client: ElasticLog; + constructor(optsArg: IElasticLogConstructorOptions); + log(info: any, callback: any): void; +} diff --git a/dist/elasticlog.classes.winstontransport.js b/dist/elasticlog.classes.winstontransport.js new file mode 100644 index 0000000..f4d20d9 --- /dev/null +++ b/dist/elasticlog.classes.winstontransport.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const winston_transport_1 = require("winston-transport"); +const elasticlog_classes_elasticlog_1 = require("./elasticlog.classes.elasticlog"); +class ElasticWinstonTransport extends winston_transport_1.Transport { + constructor(optsArg) { + super(optsArg); + this.client = new elasticlog_classes_elasticlog_1.ElasticLog(optsArg); + } + log(info, callback) { + this.client.log(info); + callback(); + } +} +exports.ElasticWinstonTransport = ElasticWinstonTransport; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLndpbnN0b250cmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lbGFzdGljbG9nLmNsYXNzZXMud2luc3RvbnRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlEQUE4QztBQUM5QyxtRkFHeUM7QUFPekMsNkJBQXFDLFNBQVEsNkJBQVM7SUFHcEQsWUFBWSxPQUFzQztRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksMENBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLFFBQVEsRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBWkQsMERBWUMifQ== \ No newline at end of file diff --git a/dist/elasticlog.plugins.d.ts b/dist/elasticlog.plugins.d.ts index 878e99c..ab77763 100644 --- a/dist/elasticlog.plugins.d.ts +++ b/dist/elasticlog.plugins.d.ts @@ -1,3 +1,3 @@ -import * as elasticsearch from 'elasticsearch'; -import * as smartdelay from 'smartdelay'; +import * as elasticsearch from "elasticsearch"; +import * as smartdelay from "smartdelay"; export { elasticsearch, smartdelay }; diff --git a/dist/elasticlog.plugins.js b/dist/elasticlog.plugins.js index c450976..a9b2b4b 100644 --- a/dist/elasticlog.plugins.js +++ b/dist/elasticlog.plugins.js @@ -4,4 +4,4 @@ const elasticsearch = require("elasticsearch"); exports.elasticsearch = elasticsearch; const smartdelay = require("smartdelay"); exports.smartdelay = smartdelay; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZWxhc3RpY2xvZy5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0NBQStDO0FBRzdDLHNDQUFhO0FBRmYseUNBQXlDO0FBR3ZDLGdDQUFVIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZWxhc3RpY2xvZy5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0NBQStDO0FBRXRDLHNDQUFhO0FBRHRCLHlDQUF5QztBQUNqQixnQ0FBVSJ9 \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index f1b9faa..24f303b 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1 +1 @@ -export * from './elasticlog.classes.elasticlog'; +export * from "./elasticlog.classes.elasticlog"; diff --git a/dist/index.js b/dist/index.js index bd75613..71fd9c9 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4,4 +4,4 @@ function __export(m) { } Object.defineProperty(exports, "__esModule", { value: true }); __export(require("./elasticlog.classes.elasticlog")); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUErQyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFnRCJ9 \ No newline at end of file diff --git a/package.json b/package.json index 33170d5..8ab8f7c 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "@types/elasticsearch": "^5.0.19", "elasticsearch": "^14.0.0", "smartdelay": "^1.0.4", - "typings-global": "^1.0.16" + "typings-global": "^1.0.16", + "winston-transport": "^3.0.1" }, "config": { "commitizen": { diff --git a/ts/elasticlog.classes.elasticlog.ts b/ts/elasticlog.classes.elasticlog.ts index 32f6e1f..d0d4371 100644 --- a/ts/elasticlog.classes.elasticlog.ts +++ b/ts/elasticlog.classes.elasticlog.ts @@ -1,46 +1,50 @@ -export type Environment = 'local' | 'test' | 'staging' | 'production' ; +export type Environment = "local" | "test" | "staging" | "production"; // interfaces -import { Client as ElasticClient } from 'elasticsearch' +import { Client as ElasticClient } from "elasticsearch"; +import { IWinstonStandardLogParams } from "./elasticlog.classes.winstontransport"; + +// other classes +import { LogScheduler } from "./elasticlog.classes.logscheduler"; export interface LogContext { - zone?: string, - containerName?: string - environment: Environment + zone?: string; + containerName?: string; + environment: Environment; } -export type TLogSeverity = 'log' | 'info' | 'warn' | 'error' | 'fatal' +export type TLogSeverity = "log" | "info" | "warn" | "error" | "fatal"; export interface IStandardLogParams { - message: string - severity: string + message: string; + severity: string; } export interface IElasticLogConstructorOptions { - port: number - domain: string - ssl: boolean - user?: string - pass?: string - logContext: LogContext + port: number; + domain: string; + ssl: boolean; + user?: string; + pass?: string; + logContext: LogContext; } export class ElasticLog { - client: ElasticClient - logContext: LogContext - logScheduler = new LogScheduler() + client: ElasticClient; + logContext: LogContext; + logScheduler = new LogScheduler(this); /** * sets up an instance of Elastic log * @param optionsArg */ - constructor (optionsArg: IElasticLogConstructorOptions) { - this.logContext = optionsArg.logContext + constructor(optionsArg: IElasticLogConstructorOptions) { + this.logContext = optionsArg.logContext; this.client = new ElasticClient({ host: this.computeHostString(optionsArg), - log: 'trace' + log: "trace" }); - }; + } /** * computes the host string from the constructor options @@ -48,42 +52,46 @@ export class ElasticLog { */ private computeHostString(optionsArg: IElasticLogConstructorOptions): string { let hostString = `${optionsArg.domain}:${optionsArg.port}`; - if(optionsArg.user && optionsArg.pass) { - hostString = `${optionsArg.user}:${optionsArg.pass}@${hostString}` + if (optionsArg.user && optionsArg.pass) { + hostString = `${optionsArg.user}:${optionsArg.pass}@${hostString}`; } - if(optionsArg.ssl) { - hostString = `https://${hostString}` + if (optionsArg.ssl) { + hostString = `https://${hostString}`; } else { - hostString = `http://${hostString}` + hostString = `http://${hostString}`; } return hostString; } - log(logObject: IStandardLogParams) { - const now = new Date() - this.client.index({ - index: `logs-${now.getFullYear()}.${("0" + (now.getMonth() + 1)).slice(-2)}.${now.getDate()}`, - type: 'log', - body: { - '@timestamp': now.toISOString(), - container: this.logContext.containerName, - environment: this.logContext.environment, - severity: logObject.severity, - message: logObject.message + async log(logObject: IStandardLogParams, scheduleOverwrite = false) { + const now = new Date(); + if (this.logScheduler.logsScheduled && !scheduleOverwrite) { + this.logScheduler.scheduleLog(logObject); + return; + } + this.client.index( + { + index: `logs-${now.getFullYear()}.${("0" + (now.getMonth() + 1)).slice( + -2 + )}.${now.getDate()}`, + type: "log", + body: { + "@timestamp": now.toISOString(), + container: this.logContext.containerName, + environment: this.logContext.environment, + severity: logObject.severity, + message: logObject.message + } + }, + (error, response) => { + if (error) { + console.log("ElasticLog encountered an error:"); + console.log(error); + this.logScheduler.addFailedLog(logObject); + } else { + console.log(`ElasticLog: ${logObject.message}`); + } } - }, (error, response) => { - if(error) { - console.log(error) - this.logScheduler.addFailedLog(logObject) - } - }) + ); } - -}; - -export class LogScheduler { - logStorage: any[] - addFailedLog(objectArg: any | IStandardLogParams) { - - } -} +} diff --git a/ts/elasticlog.classes.logscheduler.ts b/ts/elasticlog.classes.logscheduler.ts new file mode 100644 index 0000000..e97b321 --- /dev/null +++ b/ts/elasticlog.classes.logscheduler.ts @@ -0,0 +1,47 @@ +import { + ElasticLog, + IStandardLogParams +} from "./elasticlog.classes.elasticlog"; + +export class LogScheduler { + elasticLogRef: ElasticLog; + logsScheduled = false; + logStorage: any[] = []; + + constructor(elasticLogRefArg: ElasticLog) { + this.elasticLogRef = elasticLogRefArg; + } + + addFailedLog(objectArg: any | IStandardLogParams) { + this.logStorage.push(objectArg); + this.setRetry(); + } + scheduleLog(logObject: any) { + this.logStorage.push(logObject); + } + + setRetry() { + setTimeout(() => { + const oldStorage = this.logStorage; + this.logStorage = []; + for (let logObject of oldStorage) { + this.elasticLogRef.log(logObject, true); + } + if (this.logStorage.length === 0) { + console.log("ElasticLog retry success!!!"); + this.logsScheduled = false; + } else { + console.log("ElasticLog retry failed"); + this.setRetry(); + } + }, 5000); + } + + deferSend() { + if (!this.logsScheduled) { + console.log("Retry ElasticLog in 5 seconds!"); + this.logsScheduled = true; + this.setRetry(); + } + } +} diff --git a/ts/elasticlog.classes.winstontransport.ts b/ts/elasticlog.classes.winstontransport.ts new file mode 100644 index 0000000..3a0b67f --- /dev/null +++ b/ts/elasticlog.classes.winstontransport.ts @@ -0,0 +1,27 @@ +import { Transport } from "winston-transport"; +import { + ElasticLog, + IElasticLogConstructorOptions +} from "./elasticlog.classes.elasticlog"; + +export interface IWinstonStandardLogParams { + message: string; + level: string; +} + +export class ElasticWinstonTransport extends Transport { + client: ElasticLog; + + constructor(optsArg: IElasticLogConstructorOptions) { + super(optsArg); + this.client = new ElasticLog(optsArg); + } + + log(info, callback) { + this.client.log({ + severity: info.level, + message: info.message, + }); + callback(); + } +} diff --git a/ts/elasticlog.plugins.ts b/ts/elasticlog.plugins.ts index 09e8f6e..ab77763 100644 --- a/ts/elasticlog.plugins.ts +++ b/ts/elasticlog.plugins.ts @@ -1,6 +1,3 @@ -import * as elasticsearch from 'elasticsearch'; -import * as smartdelay from 'smartdelay'; -export { - elasticsearch, - smartdelay -} +import * as elasticsearch from "elasticsearch"; +import * as smartdelay from "smartdelay"; +export { elasticsearch, smartdelay }; diff --git a/ts/index.ts b/ts/index.ts index 479955f..24f303b 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1 +1 @@ -export * from './elasticlog.classes.elasticlog' +export * from "./elasticlog.classes.elasticlog"; diff --git a/yarn.lock b/yarn.lock index a01bbab..44779b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -590,6 +590,10 @@ vinyl@^2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +winston-transport@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-3.0.1.tgz#8008b15eef5660c4fb3fa094d58ccbd08528c58d" + word-wrap@^1.0.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"