72 lines
2.2 KiB
JavaScript
Executable File
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');
|
|
}
|
|
};
|