diff --git a/package.json b/package.json index 396fe5a266398..3bb8b83afbbc4 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,8 @@ "request": "^2.40.0", "requirefrom": "^0.2.0", "semver": "^4.2.0", - "serve-favicon": "~2.2.0" + "serve-favicon": "~2.2.0", + "through": "^2.3.6" }, "devDependencies": { "connect": "~2.19.5", diff --git a/src/server/bin/kibana.js b/src/server/bin/kibana.js index 617d0ed29622b..ee3381abf7076 100755 --- a/src/server/bin/kibana.js +++ b/src/server/bin/kibana.js @@ -18,6 +18,7 @@ program.option('-c, --config ', 'Path to the config file'); program.option('-p, --port ', 'The port to bind to', parseInt); program.option('-q, --quiet', 'Turns off logging'); program.option('-H, --host ', 'The host to bind to'); +program.option('-l, --log-file ', 'The file to log to'); program.option('--plugins ', 'Path to scan for plugins'); program.parse(process.argv); @@ -49,6 +50,10 @@ if (program.quiet) { config.quiet = program.quiet; } +if (program.logFile) { + config.log_file = program.logFile; +} + if (program.host) { config.host = program.host; } diff --git a/src/server/config/index.js b/src/server/config/index.js index 846862db4560e..9d9c833541553 100644 --- a/src/server/config/index.js +++ b/src/server/config/index.js @@ -45,7 +45,8 @@ var config = module.exports = { kibana : kibana, package : require(packagePath), htpasswd : htpasswdPath, - buildNum : '@@buildNum' + buildNum : '@@buildNum', + log_file : kibana.log_file || null }; config.plugins = listPlugins(config); diff --git a/src/server/config/kibana.yml b/src/server/config/kibana.yml index 3bc7102bf164d..5ce9630ec8ae7 100644 --- a/src/server/config/kibana.yml +++ b/src/server/config/kibana.yml @@ -49,3 +49,6 @@ verify_ssl: true # Set the path to where you would like the process id file to be created. # pid_file: /var/run/kibana.pid +# If you would like to send the log output to a file you can set the path below. +# This will also turn off the STDOUT log output. +# log_file: ./kibana.log \ No newline at end of file diff --git a/src/server/lib/JSONStream.js b/src/server/lib/createJSONStream.js similarity index 59% rename from src/server/lib/JSONStream.js rename to src/server/lib/createJSONStream.js index f059691ea3c89..042b6dc0a16a0 100644 --- a/src/server/lib/JSONStream.js +++ b/src/server/lib/createJSONStream.js @@ -1,6 +1,5 @@ var _ = require('lodash'); -var Writable = require('stream').Writable; -var util = require('util'); +var through = require('through'); var levels = { 10: 'trace', @@ -11,14 +10,7 @@ var levels = { 60: 'fatal' }; -function JSONStream(options) { - options = options || {}; - Writable.call(this, options); -} - -util.inherits(JSONStream, Writable); - -JSONStream.prototype._write = function (entry, encoding, callback) { +function write(entry) { entry = JSON.parse(entry.toString('utf8')); var env = process.env.NODE_ENV || 'development'; @@ -36,8 +28,13 @@ JSONStream.prototype._write = function (entry, encoding, callback) { if (!output.message) output.message = output.error.message; } - process.stdout.write(JSON.stringify(output) + "\n"); - callback(); -}; + this.queue(JSON.stringify(output) + '\n'); +} + +function end() { + this.queue(null); +} -module.exports = JSONStream; +module.exports = function () { + return through(write, end); +}; \ No newline at end of file diff --git a/src/server/lib/logger.js b/src/server/lib/logger.js index befa814b51fc3..78210738be639 100644 --- a/src/server/lib/logger.js +++ b/src/server/lib/logger.js @@ -2,18 +2,33 @@ var _ = require('lodash'); var morgan = require('morgan'); var env = process.env.NODE_ENV || 'development'; var bunyan = require('bunyan'); +var fs = require('fs'); var StdOutStream = require('./StdOutStream'); -var JSONStream = require('./JSONStream'); +var createJSONStream = require('./createJSONStream'); var config = require('../config'); -var stream = { stream: new JSONStream() }; var streams = []; +// Set the default stream based on the enviroment. If we are on development then +// then we are going to create a pretty stream. Everytyhing else will get the +// JSON stream to stdout. +var defaultStream; if (env === 'development') { - stream.stream = new StdOutStream(); + defaultStream = new StdOutStream(); +} else { + defaultStream = createJSONStream() + .pipe(process.stdout); } -if (!config.quiet) { - streams.push(stream); +// If we are not being oppressed and we are not sending the output to a log file +// push the default stream to the list of streams +if (!config.quiet && !config.log_file) { + streams.push({ stream: defaultStream }); +} + +// Send the stream to a file using the json format. +if (config.log_file) { + var fileStream = fs.createWriteStream(config.log_file); + streams.push({ stream: createJSONStream().pipe(fileStream) }); } var logger = module.exports = bunyan.createLogger({