Compare commits

..

8 Commits

Author SHA1 Message Date
7cbf39ed12 1.0.5 2018-01-27 19:51:47 +01:00
e27b73f1a4 adjust coverageTreshold 2018-01-27 19:51:44 +01:00
c8e3845774 update style 2018-01-27 19:46:44 +01:00
3e1c9724a8 update 2018-01-27 19:46:15 +01:00
59ee06b08c 1.0.4 2018-01-27 19:16:09 +01:00
fd1d92edd6 feat(core): implement winston support 2018-01-27 19:16:05 +01:00
9e85f22891 1.0.3 2018-01-26 02:00:05 +01:00
9cf78e65ac feat(core): update index generation 2018-01-26 02:00:01 +01:00
19 changed files with 318 additions and 102 deletions

View File

@ -1,11 +1,12 @@
export declare type Environment = 'local' | 'test' | 'staging' | 'production'; export declare type Environment = "local" | "test" | "staging" | "production";
import { Client as ElasticClient } from 'elasticsearch'; import { Client as ElasticClient } from "elasticsearch";
import { LogScheduler } from "./elasticlog.classes.logscheduler";
export interface LogContext { export interface LogContext {
zone?: string; zone?: string;
containerName?: string; containerName?: string;
environment: Environment; environment: Environment;
} }
export declare type TLogSeverity = 'log' | 'info' | 'warn' | 'error' | 'fatal'; export declare type TLogSeverity = "log" | "info" | "warn" | "error" | "fatal";
export interface IStandardLogParams { export interface IStandardLogParams {
message: string; message: string;
severity: string; severity: string;
@ -32,9 +33,5 @@ export declare class ElasticLog<T> {
* @param optionsArg * @param optionsArg
*/ */
private computeHostString(optionsArg); private computeHostString(optionsArg);
log(logObject: IStandardLogParams): void; log(logObject: IStandardLogParams, scheduleOverwrite?: boolean): Promise<void>;
}
export declare class LogScheduler {
logStorage: any[];
addFailedLog(objectArg: any | IStandardLogParams): void;
} }

View File

@ -1,21 +1,30 @@
"use strict"; "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 }); Object.defineProperty(exports, "__esModule", { value: true });
// interfaces // interfaces
const elasticsearch_1 = require("elasticsearch"); const elasticsearch_1 = require("elasticsearch");
// other classes
const elasticlog_classes_logscheduler_1 = require("./elasticlog.classes.logscheduler");
class ElasticLog { class ElasticLog {
/** /**
* sets up an instance of Elastic log * sets up an instance of Elastic log
* @param optionsArg * @param optionsArg
*/ */
constructor(optionsArg) { constructor(optionsArg) {
this.logScheduler = new LogScheduler(); this.logScheduler = new elasticlog_classes_logscheduler_1.LogScheduler(this);
this.logContext = optionsArg.logContext; this.logContext = optionsArg.logContext;
this.client = new elasticsearch_1.Client({ this.client = new elasticsearch_1.Client({
host: this.computeHostString(optionsArg), host: this.computeHostString(optionsArg),
log: 'trace' log: "trace"
}); });
} }
;
/** /**
* computes the host string from the constructor options * computes the host string from the constructor options
* @param optionsArg * @param optionsArg
@ -33,31 +42,35 @@ class ElasticLog {
} }
return hostString; return hostString;
} }
log(logObject) { log(logObject, scheduleOverwrite = false) {
const now = new Date(); return __awaiter(this, void 0, void 0, function* () {
this.client.index({ const now = new Date();
index: `logs-${now.getFullYear()}.${now.getMonth() + 1}.${now.getDate()}`, if (this.logScheduler.logsScheduled && !scheduleOverwrite) {
type: 'log', this.logScheduler.scheduleLog(logObject);
body: { return;
'@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);
} }
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; exports.ElasticLog = ElasticLog;
; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLmVsYXN0aWNsb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lbGFzdGljbG9nLmNsYXNzZXMuZWxhc3RpY2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBRUEsYUFBYTtBQUNiLGlEQUF3RDtBQUd4RCxnQkFBZ0I7QUFDaEIsdUZBQWlFO0FBd0JqRTtJQUtFOzs7T0FHRztJQUNILFlBQVksVUFBeUM7UUFOckQsaUJBQVksR0FBRyxJQUFJLDhDQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFPcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxzQkFBYSxDQUFDO1lBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDO1lBQ3hDLEdBQUcsRUFBRSxPQUFPO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLFVBQXlDO1FBQ2pFLElBQUksVUFBVSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0QsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QyxVQUFVLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7UUFDckUsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFVBQVUsR0FBRyxXQUFXLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLFVBQVUsR0FBRyxVQUFVLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFSyxHQUFHLENBQUMsU0FBNkIsRUFBRSxpQkFBaUIsR0FBRyxLQUFLOztZQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekMsTUFBTSxDQUFDO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmO2dCQUNFLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDcEUsQ0FBQyxDQUFDLENBQ0gsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksRUFBRSxLQUFLO2dCQUNYLElBQUksRUFBRTtvQkFDSixZQUFZLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRTtvQkFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtvQkFDeEMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVztvQkFDeEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO29CQUM1QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87aUJBQzNCO2FBQ0YsRUFDRCxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDbEIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7b0JBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztLQUFBO0NBQ0Y7QUFqRUQsZ0NBaUVDIn0=
class LogScheduler {
addFailedLog(objectArg) {
}
}
exports.LogScheduler = LogScheduler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLmVsYXN0aWNsb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lbGFzdGljbG9nLmNsYXNzZXMuZWxhc3RpY2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGFBQWE7QUFDYixpREFBdUQ7QUF3QnZEO0lBS0U7OztPQUdHO0lBQ0gsWUFBYSxVQUF5QztRQU50RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7UUFPL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxzQkFBYSxDQUFDO1lBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDO1lBQ3hDLEdBQUcsRUFBRSxPQUFPO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFBLENBQUM7SUFFRjs7O09BR0c7SUFDSyxpQkFBaUIsQ0FBQyxVQUF5QztRQUNqRSxJQUFJLFVBQVUsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNELEVBQUUsQ0FBQSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEMsVUFBVSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3BFLENBQUM7UUFDRCxFQUFFLENBQUEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixVQUFVLEdBQUcsV0FBVyxVQUFVLEVBQUUsQ0FBQTtRQUN0QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixVQUFVLEdBQUcsVUFBVSxVQUFVLEVBQUUsQ0FBQTtRQUNyQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsR0FBRyxDQUFDLFNBQTZCO1FBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDaEIsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3pFLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFO2dCQUNKLFlBQVksRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFO2dCQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO2dCQUN4QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUN4QyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7Z0JBQzVCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTzthQUMzQjtTQUNGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDckIsRUFBRSxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0NBRUY7QUF0REQsZ0NBc0RDO0FBQUEsQ0FBQztBQUVGO0lBRUUsWUFBWSxDQUFDLFNBQW1DO0lBRWhELENBQUM7Q0FDRjtBQUxELG9DQUtDIn0=

View File

@ -0,0 +1,11 @@
import { ElasticLog, IStandardLogParams } from "./elasticlog.classes.elasticlog";
export declare class LogScheduler {
elasticLogRef: ElasticLog<any>;
logsScheduled: boolean;
logStorage: any[];
constructor(elasticLogRefArg: ElasticLog<any>);
addFailedLog(objectArg: any | IStandardLogParams): void;
scheduleLog(logObject: any): void;
setRetry(): void;
deferSend(): void;
}

42
dist/elasticlog.classes.logscheduler.js vendored Normal file
View File

@ -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

View File

@ -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<any>;
constructor(optsArg: IElasticLogConstructorOptions);
log(info: any, callback: any): void;
}

View File

@ -0,0 +1,19 @@
"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({
severity: info.level,
message: info.message,
});
callback();
}
}
exports.ElasticWinstonTransport = ElasticWinstonTransport;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5jbGFzc2VzLndpbnN0b250cmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9lbGFzdGljbG9nLmNsYXNzZXMud2luc3RvbnRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlEQUE4QztBQUM5QyxtRkFHeUM7QUFPekMsNkJBQXFDLFNBQVEsNkJBQVM7SUFHcEQsWUFBWSxPQUFzQztRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksMENBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDLENBQUM7UUFDSCxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQWZELDBEQWVDIn0=

View File

@ -1,2 +1,3 @@
declare const removeme: {}; import * as elasticsearch from "elasticsearch";
export { removeme }; import * as smartdelay from "smartdelay";
export { elasticsearch, smartdelay };

View File

@ -1,5 +1,7 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const removeme = {}; const elasticsearch = require("elasticsearch");
exports.removeme = removeme; exports.elasticsearch = elasticsearch;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZWxhc3RpY2xvZy5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBRWxCLDRCQUFRIn0= const smartdelay = require("smartdelay");
exports.smartdelay = smartdelay;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2xvZy5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZWxhc3RpY2xvZy5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0NBQStDO0FBRXRDLHNDQUFhO0FBRHRCLHlDQUF5QztBQUNqQixnQ0FBVSJ9

2
dist/index.d.ts vendored
View File

@ -1 +1 @@
export * from './elasticlog.classes.elasticlog'; export * from "./elasticlog.classes.elasticlog";

2
dist/index.js vendored
View File

@ -4,4 +4,4 @@ function __export(m) {
} }
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
__export(require("./elasticlog.classes.elasticlog")); __export(require("./elasticlog.classes.elasticlog"));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUErQyJ9 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFnRCJ9

View File

@ -3,5 +3,8 @@
"npmGlobalTools": [ "npmGlobalTools": [
"npmts" "npmts"
] ]
},
"npmts": {
"coverageTreshold": 50
} }
} }

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "elasticlog", "name": "elasticlog",
"version": "1.0.2", "version": "1.0.5",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

View File

@ -1,6 +1,6 @@
{ {
"name": "elasticlog", "name": "elasticlog",
"version": "1.0.2", "version": "1.0.5",
"description": "log to elasticsearch in a kibana compatible format", "description": "log to elasticsearch in a kibana compatible format",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
@ -18,7 +18,9 @@
"dependencies": { "dependencies": {
"@types/elasticsearch": "^5.0.19", "@types/elasticsearch": "^5.0.19",
"elasticsearch": "^14.0.0", "elasticsearch": "^14.0.0",
"typings-global": "^1.0.16" "smartdelay": "^1.0.4",
"typings-global": "^1.0.16",
"winston-transport": "^3.0.1"
}, },
"config": { "config": {
"commitizen": { "commitizen": {

View File

@ -1,46 +1,50 @@
export type Environment = 'local' | 'test' | 'staging' | 'production' ; export type Environment = "local" | "test" | "staging" | "production";
// interfaces // 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 { export interface LogContext {
zone?: string, zone?: string;
containerName?: string containerName?: string;
environment: Environment environment: Environment;
} }
export type TLogSeverity = 'log' | 'info' | 'warn' | 'error' | 'fatal' export type TLogSeverity = "log" | "info" | "warn" | "error" | "fatal";
export interface IStandardLogParams { export interface IStandardLogParams {
message: string message: string;
severity: string severity: string;
} }
export interface IElasticLogConstructorOptions { export interface IElasticLogConstructorOptions {
port: number port: number;
domain: string domain: string;
ssl: boolean ssl: boolean;
user?: string user?: string;
pass?: string pass?: string;
logContext: LogContext logContext: LogContext;
} }
export class ElasticLog<T> { export class ElasticLog<T> {
client: ElasticClient client: ElasticClient;
logContext: LogContext logContext: LogContext;
logScheduler = new LogScheduler() logScheduler = new LogScheduler(this);
/** /**
* sets up an instance of Elastic log * sets up an instance of Elastic log
* @param optionsArg * @param optionsArg
*/ */
constructor (optionsArg: IElasticLogConstructorOptions) { constructor(optionsArg: IElasticLogConstructorOptions) {
this.logContext = optionsArg.logContext this.logContext = optionsArg.logContext;
this.client = new ElasticClient({ this.client = new ElasticClient({
host: this.computeHostString(optionsArg), host: this.computeHostString(optionsArg),
log: 'trace' log: "trace"
}); });
}; }
/** /**
* computes the host string from the constructor options * computes the host string from the constructor options
@ -48,42 +52,46 @@ export class ElasticLog<T> {
*/ */
private computeHostString(optionsArg: IElasticLogConstructorOptions): string { private computeHostString(optionsArg: IElasticLogConstructorOptions): string {
let hostString = `${optionsArg.domain}:${optionsArg.port}`; let hostString = `${optionsArg.domain}:${optionsArg.port}`;
if(optionsArg.user && optionsArg.pass) { if (optionsArg.user && optionsArg.pass) {
hostString = `${optionsArg.user}:${optionsArg.pass}@${hostString}` hostString = `${optionsArg.user}:${optionsArg.pass}@${hostString}`;
} }
if(optionsArg.ssl) { if (optionsArg.ssl) {
hostString = `https://${hostString}` hostString = `https://${hostString}`;
} else { } else {
hostString = `http://${hostString}` hostString = `http://${hostString}`;
} }
return hostString; return hostString;
} }
log(logObject: IStandardLogParams) { async log(logObject: IStandardLogParams, scheduleOverwrite = false) {
const now = new Date() const now = new Date();
this.client.index({ if (this.logScheduler.logsScheduled && !scheduleOverwrite) {
index: `logs-${now.getFullYear()}.${now.getMonth() + 1}.${now.getDate()}`, this.logScheduler.scheduleLog(logObject);
type: 'log', return;
body: { }
'@timestamp': now.toISOString(), this.client.index(
container: this.logContext.containerName, {
environment: this.logContext.environment, index: `logs-${now.getFullYear()}.${("0" + (now.getMonth() + 1)).slice(
severity: logObject.severity, -2
message: logObject.message )}.${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) {
} }
} }

View File

@ -0,0 +1,47 @@
import {
ElasticLog,
IStandardLogParams
} from "./elasticlog.classes.elasticlog";
export class LogScheduler {
elasticLogRef: ElasticLog<any>;
logsScheduled = false;
logStorage: any[] = [];
constructor(elasticLogRefArg: ElasticLog<any>) {
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();
}
}
}

View File

@ -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<any>;
constructor(optsArg: IElasticLogConstructorOptions) {
super(optsArg);
this.client = new ElasticLog(optsArg);
}
log(info, callback) {
this.client.log({
severity: info.level,
message: info.message
});
callback();
}
}

View File

@ -1,4 +1,3 @@
const removeme = {}; import * as elasticsearch from "elasticsearch";
export { import * as smartdelay from "smartdelay";
removeme export { elasticsearch, smartdelay };
}

View File

@ -1 +1 @@
export * from './elasticlog.classes.elasticlog' export * from "./elasticlog.classes.elasticlog";

View File

@ -114,10 +114,24 @@ concat-map@0.0.1:
version "0.0.1" version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
conventional-commit-types@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz#5db95739d6c212acbe7b6f656a11b940baa68946"
core-util-is@~1.0.0: core-util-is@~1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
cz-conventional-changelog@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764"
dependencies:
conventional-commit-types "^2.0.0"
lodash.map "^4.5.1"
longest "^1.0.1"
right-pad "^1.0.1"
word-wrap "^1.0.3"
define-properties@^1.1.2: define-properties@^1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
@ -309,6 +323,10 @@ lodash.isempty@^4.4.0:
version "4.4.0" version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
lodash.map@^4.5.1:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
lodash.trimend@^4.5.1: lodash.trimend@^4.5.1:
version "4.5.1" version "4.5.1"
resolved "https://registry.yarnpkg.com/lodash.trimend/-/lodash.trimend-4.5.1.tgz#12804437286b98cad8996b79414e11300114082f" resolved "https://registry.yarnpkg.com/lodash.trimend/-/lodash.trimend-4.5.1.tgz#12804437286b98cad8996b79414e11300114082f"
@ -321,6 +339,10 @@ lodash@^4.17.4:
version "4.17.4" version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
memwatch-next@^0.3.0: memwatch-next@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/memwatch-next/-/memwatch-next-0.3.0.tgz#2111050f9a906e0aa2d72a4ec0f0089c78726f8f" resolved "https://registry.yarnpkg.com/memwatch-next/-/memwatch-next-0.3.0.tgz#2111050f9a906e0aa2d72a4ec0f0089c78726f8f"
@ -411,6 +433,10 @@ require-reload@0.2.2:
version "0.2.2" version "0.2.2"
resolved "https://registry.yarnpkg.com/require-reload/-/require-reload-0.2.2.tgz#29a7591846caf91b6e8a3cda991683f95f8d7d42" resolved "https://registry.yarnpkg.com/require-reload/-/require-reload-0.2.2.tgz#29a7591846caf91b6e8a3cda991683f95f8d7d42"
right-pad@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0"
safe-buffer@~5.1.0, safe-buffer@~5.1.1: safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
@ -423,7 +449,7 @@ smartchai@^1.0.3:
code "^5.1.0" code "^5.1.0"
typings-global "^1.0.20" typings-global "^1.0.20"
smartdelay@^1.0.3: smartdelay@^1.0.3, smartdelay@^1.0.4:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/smartdelay/-/smartdelay-1.0.4.tgz#791c1a4ee6770494064c10b1d2d2b8e6f3105b82" resolved "https://registry.yarnpkg.com/smartdelay/-/smartdelay-1.0.4.tgz#791c1a4ee6770494064c10b1d2d2b8e6f3105b82"
dependencies: dependencies:
@ -564,6 +590,14 @@ vinyl@^2.0.1:
remove-trailing-separator "^1.0.1" remove-trailing-separator "^1.0.1"
replace-ext "^1.0.0" 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"
wrappy@1: wrappy@1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"