Files
elasticsearch-js/src/lib/loggers/tracer.js
2014-01-28 16:52:05 -07:00

72 lines
2.2 KiB
JavaScript
Executable File

/**
* Logger that writes to a file, but the file can be executed as a shell script,
* meaning everything but the curl commands are commented out
*
* @class Loggers.Tracer
* @extends StreamLogger
* @constructor
* @param {Object} config - The configuration for the Logger (See LoggerAbstract for generic options)
* @param {String} config.path - The location to write
* @param {Log} bridge - The object that triggers logging events, which we will record
*/
module.exports = Tracer;
var StreamLogger = require('./stream');
var fs = require('fs');
var _ = require('../utils');
var url = require('url');
function Tracer(log, config) {
if (config.path === false) {
config.stream = process.stderr;
} else {
config.stream = fs.createWriteStream(config.path || 'elasticsearch-tracer.log');
}
this.curlHost = config.curlHost || 'localhost';
this.curlPort = config.curlPort || 9200;
StreamLogger.call(this, log, config);
}
_.inherits(Tracer, StreamLogger);
var usefulUrlFields = ['protocol', 'slashes', 'port', 'hostname', 'pathname', 'query'];
Tracer.prototype._formatTraceMessage = function (req) {
var reqUrl = _.pick(url.parse(req.url, true, false), usefulUrlFields);
var originalHost = url.format(_.pick(reqUrl, 'protocol', 'hostname', 'port'));
reqUrl.port = this.curlPort;
reqUrl.hostname = this.curlHost;
reqUrl.query = _.defaults(reqUrl.query || {}, { pretty: true });
/* jshint quotmark: double */
var curlCall =
"# " + originalHost + "\n" +
"curl '" + url.format(reqUrl).replace(/'/g, "\\'") + "' -X" + req.method.toUpperCase() +
(req.body ? " -d '" + this._prettyJson(req.body) + "'" : "");
/* jshint quotmark: single */
return {
curl: curlCall,
msg: '-> ' + req.status + '\n' + req.response
};
};
function comment(str) {
return _.map(str.split(/\r?\n/g), function (line) {
return '# ' + line;
}).join('\n');
}
Tracer.prototype.write = function (label, msg) {
var lead = comment(label + ': ' + this.timestamp()) + '\n';
if (typeof msg === 'string') {
this.stream.write(lead + comment(msg) + '\n\n', 'utf8');
} else {
this.stream.write(lead + msg.curl + '\n' + comment(msg.msg) + '\n\n', 'utf8');
}
};