logstash-relay
Version:
A simple NodeJS service to relay JSNLogs or Log4Javascript/Log4JS(client) event messages to Logstash.
260 lines (248 loc) • 7.69 kB
JavaScript
/* eslint-disable no-console */
const configFile = './config/config.js';
const __ = require('lodash');
const fs = require('fs');
const inquirer = require('inquirer');
const validate = require('./validate');
const baseConfig = require('../config/default-config');
const config = require('../config/config');
const modifyFiles = require('./utils');
const conf = __.merge(baseConfig, config);
const modes = [
'Stand-alone Service',
'Embedded service',
'AWS Lambda Function'
];
const questions = [];
function validateInt(val) {
return validate(val, 'int');
}
function setupQuestions() {
questions.push({
type: 'list',
name: 'mode',
default: modes,
choices: modes,
message: 'Select the service mode:',
}, {
type: 'input',
name: 'port',
default: conf.server.port,
message: 'Server port to listen for HTTP requests:',
validate: validateInt,
when: (answers) => {
return (answers.mode !== modes[2]);
}
}, {
type: 'input',
name: 'shutdownTime',
default: conf.server.shutdownTime,
message: 'Graceful server shutdown period in milliseconds:',
validate: validateInt
}, {
type: 'input',
name: 'timeout',
default: conf.server.timeout,
message: 'Request timeout period in seconds:',
validate: validateInt
}, {
type: 'confirm',
name: 'sslEnabled',
default: conf.server.sslEnabled,
message: 'Enable SSL?',
when: (answers) => {
return (answers.mode !== modes[2]);
}
}, {
type: 'input',
name: 'sslPort',
default: conf.server.sslPort,
message: 'Server port to listen for HTTP requests:',
validate: validateInt,
when: (answers) => {
return (answers.mode !== modes[2] && answers.sslEnabled);
}
}, {
type: 'input',
name: 'sslKey',
default: conf.server.sslKey,
message: 'Full path to SSL Cert (.key) file:',
when: (answers) => {
return (answers.mode !== modes[2] && answers.sslEnabled);
}
}, {
type: 'input',
name: 'sslCert',
default: conf.server.sslCert,
message: 'Full path to SSL Cert (.pem/.crt) file:',
when: (answers) => {
return (answers.mode !== modes[2] && answers.sslEnabled);
}
}, {
type: 'input',
name: 'logDir',
default: conf.logging.logDir,
message: 'Full or relative path (from service base) to the log folder:',
when: (answers) => {
return (answers.mode === modes[0]);
}
}, {
type: 'confirm',
name: 'logJson',
default: conf.logging.options.json,
message: 'JSON logging?',
when: (answers) => {
return (answers.mode === modes[0]);
}
}, {
type: 'input',
name: 'logMaxSize',
default: conf.logging.options.maxsize,
message: 'Max log file size in bytes:',
validate: validateInt,
when: (answers) => {
return (answers.mode === modes[0]);
}
}, {
type: 'input',
name: 'logMaxFiles',
default: conf.logging.options.maxFiles,
message: 'Max number of rotated log files:',
validate: validateInt,
when: (answers) => {
return (answers.mode === modes[0]);
}
}, {
type: 'list',
name: 'logLevel',
choices: ['silly', 'debug', 'verbose', 'info', 'warn', 'error'],
default: conf.logging.options.level,
message: 'Select lowest logging level:',
when: (answers) => {
return (answers.mode === modes[0]);
}
}, {
type: 'confirm',
name: 'logstashLogging',
default: conf.logging.logstashLogging,
message: 'Enable LogStash logging for service events?',
when: (answers) => {
return (answers.mode === modes[0]);
}
}, {
type: 'input',
name: 'logstashLoggingHost',
default: conf.logstash.logging.host,
message: 'Enter the LogStash IP or Hostname for service events:',
when: (answers) => {
return (answers.mode === modes[0] && answers.logstashLogging);
}
}, {
type: 'input',
name: 'logstashLoggingPort',
default: conf.logstash.logging.port,
message: 'Enter the LogStash UDP port for service events:',
validate: validateInt,
when: (answers) => {
return (answers.mode === modes[0] && answers.logstashLogging);
}
}, {
type: 'input',
name: 'logstashLoggingAppName',
default: conf.logstash.logging.appName,
message: 'Enter the unqiue App Name to use for LogStash service events:',
when: (answers) => {
return (answers.mode === modes[0] && answers.logstashLogging);
}
}, {
type: 'input',
name: 'logstashRelayHost',
default: conf.logstash.relay.host,
message: 'Enter the LogStash IP or Hostname for relay events:'
}, {
type: 'input',
name: 'logstashRelayPort',
default: conf.logstash.relay.port,
message: 'Enter the LogStash UDP port for relay events:',
validate: validateInt
}, {
type: 'input',
name: 'logstashRelayAppName',
default: conf.logstash.relay.appName,
message: 'Enter the unqiue App Name to use for LogStash relay events:'
});
}
function mapAnswers(answers) {
if (answers.port) { conf.server.port = answers.port; }
conf.server.shutdownTime = answers.shutdownTime;
conf.server.timeout = answers.timeout;
if (answers.sslEnabled) { conf.server.sslEnabled = answers.sslEnabled; }
if (answers.sslPort) { conf.server.sslPort = answers.sslPort; }
if (answers.sslKey) { conf.server.sslKey = answers.sslKey; }
if (answers.sslCert) { conf.server.sslCert = answers.sslCert; }
if (answers.logDir) { conf.logging.logDir = answers.logDir; }
if (answers.logJson) { conf.logging.options.json = answers.logJson; }
if (answers.logMaxSize) { conf.logging.options.maxsize = answers.logMaxSize; }
if (answers.logMaxFiles) { conf.logging.options.maxFiles = answers.logMaxFiles; }
if (answers.logLevel) { conf.logging.options.level = answers.logLevel; }
if (answers.logstashLogging) { conf.logging.logstashLogging = answers.logstashLogging; }
if (answers.logstashLoggingHost) { conf.logstash.logging.host = answers.logstashLoggingHost; }
if (answers.logstashLoggingPort) { conf.logstash.logging.port = answers.logstashLoggingPort; }
if (answers.logstashLoggingAppName) { conf.logstash.logging.appName = answers.logstashLoggingAppName; }
conf.logstash.relay.host = answers.logstashRelayHost;
conf.logstash.relay.port = answers.logstashRelayPort;
conf.logstash.relay.appName = answers.logstashRelayAppName;
}
function doConfig() {
setupQuestions();
inquirer.prompt(questions)
.then((answers) => {
mapAnswers(answers);
fs.writeFileSync(configFile, `module.exports = ${JSON.stringify(conf, null, 2)};`);
if (answers.mode === 'AWS Lambda Function') {
// Replace "main": "index.js" with "main": "lambda.js"
modifyFiles(
['./package.json'],
[
{
regexp: /"main": "index.js",/,
replacement: '"main": "lambda.js",'
}
]
);
} else {
// replace "main": "lambda.js" with "main": "index.js"
modifyFiles(
['./package.json'],
[
{
regexp: /"main": "lambda.js",/,
replacement: '"main": "index.js",'
}
]
);
}
})
.catch((err) => {
console.error(err.stack || err);
});
}
inquirer.prompt([
{
type: 'confirm',
name: 'ok',
default: false,
message: 'This option will overwrite your existing configuration. Are you sure?'
}
])
.then((answers) => {
if (answers.ok) {
doConfig();
} else {
console.log('Operation aborted');
}
})
.catch((err) => {
console.error(err.stack || err);
});