antfarm
Version:
File automation framework for ants.
156 lines (154 loc) • 18.5 kB
JavaScript
;
var fs = require("fs"), winston = require("winston"), _ = require("lodash");
/**
* Logging service
*/
var Logger = (function () {
function Logger(options) {
/**
* Valid log times
* @type {{0: string; 1: string; 2: string; 3: string}}
*/
this.log_types = {
0: "debug",
1: "info",
2: "warn",
3: "error"
};
winston.emitErrs = true;
this.options = options;
this.createLogger();
}
/**
* Console formatting function.
* @param options
* @returns {string}
*/
Logger.prototype.consoleFormatter = function (options) {
var kvString = "";
_.forEach(options.meta, function (key, value) {
kvString += " " +
winston.config.colorize("silly", "" + value) +
winston.config.colorize("debug", " > ") +
key;
});
var formattedDate = new Date().toLocaleString();
return winston.config.colorize(options.level, formattedDate) + " " +
winston.config.colorize(options.level, _.padEnd(options.level, 6)) +
options.message + " " +
kvString;
};
;
/**
* Initialize logger
*/
Logger.prototype.createLogger = function () {
var lg = this;
if (this.options && this.options.log_dir) {
// Create the log directory if it does not exist
if (!fs.existsSync(this.options.log_dir)) {
fs.mkdirSync(this.options.log_dir);
}
this.logger = new winston.Logger({
transports: [
new winston.transports.File({
level: this.options.log_file_level || "info",
filename: this.options.log_dir + "/antfarm.log",
handleExceptions: true,
json: true,
maxsize: this.options.log_max_size || 5242880,
maxFiles: this.options.log_max_files || 5,
colorize: false
}),
new winston.transports.Console({
level: this.options.log_out_level || "info",
handleExceptions: true,
prettyPrint: true,
colorize: true,
silent: false,
timestamp: function () {
return Date();
},
formatter: function (options) { return lg.consoleFormatter(options); }
})
],
exitOnError: false
});
}
else {
this.logger = new winston.Logger({
transports: [
new winston.transports.Console({
level: this.options.log_out_level || "info",
handleExceptions: true,
prettyPrint: true,
colorize: true,
silent: false,
timestamp: function () {
return Date();
},
formatter: function (options) { return lg.consoleFormatter(options); }
})
],
exitOnError: false
});
}
};
/**
* Generates a formatted logging entry.
* @param entry
* @param actor
* @param instances
* @returns {Object}
*/
Logger.prototype.getEntry = function (entry, actor, instances) {
if (instances === void 0) { instances = []; }
instances.push(actor);
if (instances) {
instances.forEach(function (instance) {
if (instance && typeof instance !== "undefined") {
var super_name = instance.toString();
try {
entry[super_name] = instance.name;
if (super_name === "Job")
entry["JobId"] = instance.getId();
}
catch (e) {
}
}
});
}
return entry;
};
/**
* Create a log entry. Used for log _files and console reporting.
* @param type
* @param message
* @param actor
* @param instances
*/
Logger.prototype.log = function (type, message, actor, instances) {
if (typeof (this.log_types[type]) === "undefined") {
type = 0;
}
var log_types = this.log_types;
var entry = {
message: message,
actor: actor.constructor.name
};
var modified_entry = this.getEntry(entry, actor, instances);
this.logger.log(log_types[type], modified_entry);
};
Logger.prototype.query = function (options, callback) {
var l = this;
l.logger.query(options, function (err, results) {
if (err) {
l.log(3, "Log query error: " + err + ".", l);
}
callback(results);
});
};
return Logger;
}());
exports.Logger = Logger;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9lbnZpcm9ubWVudC9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLElBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDbEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFDNUIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU5Qjs7R0FFRztBQUNIO0lBbUJJLGdCQUFZLE9BQXdCO1FBWHBDOzs7V0FHRztRQUNPLGNBQVMsR0FBRztZQUNsQixDQUFDLEVBQUUsT0FBTztZQUNWLENBQUMsRUFBRSxNQUFNO1lBQ1QsQ0FBQyxFQUFFLE1BQU07WUFDVCxDQUFDLEVBQUUsT0FBTztTQUNiLENBQUM7UUFHRSxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxpQ0FBZ0IsR0FBMUIsVUFBMkIsT0FBTztRQUU5QixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVMsR0FBRyxFQUFFLEtBQUs7WUFDdkMsUUFBUSxJQUFJLEdBQUc7Z0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUcsS0FBTyxDQUFDO2dCQUM1QyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO2dCQUN2QyxHQUFHLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLGFBQWEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRWhELE1BQU0sQ0FBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGFB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LENBQUMsV0FBVyxDQUFDLElBQUk7U0FDaEMsQ0FBQztRQUVGLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUdNLHNCQUFLLEdBQVosVUFBYSxPQUF3QixFQUFFLFFBQWE7UUFDaEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQUMsR0FBRyxFQUFFLE9BQU87WUFDakMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDTixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxzQkFBb0IsR0FBRyxNQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTCxhQUFDO0FBQUQsQ0F2S0EsQUF1S0MsSUFBQTtBQXZLWSxjQUFNLFNBdUtsQixDQUFBIiwiZmlsZSI6ImxpYi9lbnZpcm9ubWVudC9sb2dnZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FudGZhcm1PcHRpb25zfSBmcm9tIFwiLi9vcHRpb25zXCI7XG5cbmNvbnN0ICAgZnMgPSByZXF1aXJlKFwiZnNcIiksXG4gICAgICAgIHdpbnN0b24gPSByZXF1aXJlKFwid2luc3RvblwiKSxcbiAgICAgICAgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbi8qKlxuICogTG9nZ2luZyBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuXG4gICAgcHJvdGVjdGVkIG9wdGlvbnM6IEFudGZhcm1PcHRpb25zO1xuXG4gICAgcHJvdGVjdGVkIGxvZ2dlcjtcblxuICAgIHByb3RlY3RlZCBsb2dfZGlyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZCBsb2cgdGltZXNcbiAgICAgKiBAdHlwZSB7ezA6IHN0cmluZzsgMTogc3RyaW5nOyAyOiBzdHJpbmc7IDM6IHN0cmluZ319XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvZ190eXBlcyA9IHtcbiAgICAgICAgMDogXCJkZWJ1Z1wiLFxuICAgICAgICAxOiBcImluZm9cIixcbiAgICAgICAgMjogXCJ3YXJuXCIsXG4gICAgICAgIDM6IFwiZXJyb3JcIlxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQW50ZmFybU9wdGlvbnMpIHtcbiAgICAgICAgd2luc3Rvbi5lbWl0RXJycyA9IHRydWU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY3JlYXRlTG9nZ2VyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc29sZSBmb3JtYXR0aW5nIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29uc29sZUZvcm1hdHRlcihvcHRpb25zKSB7XG5cbiAgICAgICAgbGV0IGt2U3RyaW5nID0gXCJcIjtcblxuICAgICAgICBfLmZvckVhY2gob3B0aW9ucy5tZXRhLCBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICAgICAgICAgIGt2U3RyaW5nICs9IFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbnN0b24uY29uZmlnLmNvbG9yaXplKFwic2lsbHlcIiwgYCR7dmFsdWV9YCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luc3Rvbi5jb25maWcuY29sb3JpemUoXCJkZWJ1Z1wiLCBcIiA+IFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBmb3JtYXR0ZWREYXRlID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpO1xuXG4gICAgICAgIHJldHVybiAgd2luc3Rvbi5jb25maWcuY29sb3JpemUob3B0aW9ucy5sZXZlbCwgZm9ybWF0dGVkRGF0ZSkgKyBcIiBcIiArXG4gICAgICAgICAgICAgICAgd2luc3Rvbi5jb25maWcuY29sb3JpemUob3B0aW9ucy5sZXZlbCwgXy5wYWRFbmQob3B0aW9ucy5sZXZlbCwgNikpICtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgKyBcIiBcIiArXG4gICAgICAgICAgICAgICAga3ZTdHJpbmc7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgbG9nZ2VyXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxvZ2dlcigpIHtcbiAgICAgICAgbGV0IGxnID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubG9nX2Rpcikge1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGxvZyBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLm9wdGlvbnMubG9nX2RpcikpIHtcbiAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5vcHRpb25zLmxvZ19kaXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyB3aW5zdG9uLkxvZ2dlcih7XG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBuZXcgd2luc3Rvbi50cmFuc3BvcnRzLkZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHRoaXMub3B0aW9ucy5sb2dfZmlsZV9sZXZlbCB8fCBcImluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBgJHt0aGlzLm9wdGlvbnMubG9nX2Rpcn0vYW50ZmFybS5sb2dgLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhzaXplOiB0aGlzLm9wdGlvbnMubG9nX21heF9zaXplIHx8IDUyNDI4ODAsIC8vIDVNQlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RmlsZXM6IHRoaXMub3B0aW9ucy5sb2dfbWF4X2ZpbGVzIHx8IDUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcml6ZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIG5ldyB3aW5zdG9uLnRyYW5zcG9ydHMuQ29uc29sZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdGhpcy5vcHRpb25zLmxvZ19vdXRfbGV2ZWwgfHwgXCJpbmZvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb25zOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcml6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyOiBmdW5jdGlvbihvcHRpb25zKSB7IHJldHVybiBsZy5jb25zb2xlRm9ybWF0dGVyKG9wdGlvbnMpOyB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBleGl0T25FcnJvcjogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyB3aW5zdG9uLkxvZ2dlcih7XG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0czogW1xuICAgICAgICAgICAgICAgICAgICBuZXcgd2luc3Rvbi50cmFuc3BvcnRzLkNvbnNvbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHRoaXMub3B0aW9ucy5sb2dfb3V0X2xldmVsIHx8IFwiaW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWxlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24ob3B0aW9ucykgeyByZXR1cm4gbGcuY29uc29sZUZvcm1hdHRlcihvcHRpb25zKTsgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZXhpdE9uRXJyb3I6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGZvcm1hdHRlZCBsb2dnaW5nIGVudHJ5LlxuICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAqIEBwYXJhbSBhY3RvclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZXNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFbnRyeShlbnRyeTogT2JqZWN0LCBhY3Rvcj86IGFueSwgaW5zdGFuY2VzID0gW10pIHtcbiAgICAgICAgaW5zdGFuY2VzLnB1c2goYWN0b3IpO1xuICAgICAgICBpZiAoaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihpbnN0YW5jZSl7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VwZXJfbmFtZSA9IGluc3RhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5W3N1cGVyX25hbWVdID0gaW5zdGFuY2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBlcl9uYW1lID09PSBcIkpvYlwiKSBlbnRyeVtcIkpvYklkXCJdID0gaW5zdGFuY2UuZ2V0SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGxvZyBlbnRyeS4gVXNlZCBmb3IgbG9nIF9maWxlcyBhbmQgY29uc29sZSByZXBvcnRpbmcuXG4gICAgICogQHBhcmFtIHR5cGVcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgICAqIEBwYXJhbSBhY3RvclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9nKHR5cGU6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCBhY3Rvcj86IGFueSwgIGluc3RhbmNlcz86IGFueSkge1xuICAgICAgICBpZiAodHlwZW9mKHRoaXMubG9nX3R5cGVzW3R5cGVdKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdHlwZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9nX3R5cGVzID0gdGhpcy5sb2dfdHlwZXM7XG5cbiAgICAgICAgbGV0IGVudHJ5ID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgIGFjdG9yOiBhY3Rvci5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG1vZGlmaWVkX2VudHJ5ID0gdGhpcy5nZXRFbnRyeShlbnRyeSwgYWN0b3IsIGluc3RhbmNlcyk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGxvZ190eXBlc1t0eXBlXSwgbW9kaWZpZWRfZW50cnkpO1xuICAgIH1cblxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM6IExvZ1F1ZXJ5T3B0aW9ucywgY2FsbGJhY2s6IGFueSkge1xuICAgICAgICBsZXQgbCA9IHRoaXM7XG4gICAgICAgIGwubG9nZ2VyLnF1ZXJ5KG9wdGlvbnMsIChlcnIsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsLmxvZygzLCBgTG9nIHF1ZXJ5IGVycm9yOiAke2Vycn0uYCwgbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nUXVlcnlPcHRpb25zIHtcbiAgICBmcm9tOiBEYXRlIHwgbnVtYmVyO1xuICAgIHVudGlsOiBEYXRlIHwgbnVtYmVyO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBvcmRlcjogc3RyaW5nO1xuICAgIGZpZWxkczogc3RyaW5nW107XG59Il19