UNPKG

log4js-elasticsearch

Version:

log4js appender for node that targets elasticsearch. Compatible with logstash's elasticsearch_http output; Viewable with Kibana.

134 lines (124 loc) 4.07 kB
var ElasticsearchClient = require('./elasticsearch-client'); var layouts = require('./log4js-elasticsearch-layouts'); var logstashConnectFormatter = require('./connect-logger').logstashConnectFormatter; var bulk = require('./elasticsearch-bulk'); function createAppender(layout, config, options, done) { var layoutES = makeESHelper(layout, config); var esclient = initESClient(config, options, layoutES.template, done); var eslog = bulk.makeEsLog(layout, esclient, layoutES , config.timeout, config.buffersize); return function(loggingEvent) { eslog.log(loggingEvent); }; } function configure(config, options, done) { var layout; config = loadAppenderConfig(config); layout = layouts.layout(config.layout.type, config.layout); if (typeof layout !== 'function') { console.error('Unable to find a layout named ' + config.layout.type); } return createAppender(layout, config, options, done); } function loadAppenderConfig(config) { if (!config) { config = {}; } if (typeof config.typeName !== 'function') { var value = config.typeName || 'nodejs'; config.typeName = function(loggingEvent) { return value; }; } if (!config.layout) { config.layout = { type: 'logstash' }; } //we need to pass the typeName to the layout config. //it is used both by the logstash layout and by the ES client. config.layout.typeName = config.typeName; return config; } function initESClient(config, options, template, done) { var esOptions; if (config.url) { esOptions = ElasticsearchClient.makeOptions(config.url); } else if (config.esOptions) { esOptions = config.esOptions; } else { esOptions = ElasticsearchClient.makeOptions('http://localhost:9200'); } var esclient = config.esclient || new ElasticsearchClient(esOptions); if (esclient.init) { esclient.init(); } if (template) { var templateName = template.template; esclient.getTemplate(templateName, function(err, res) { if (res === '{}' || config.forceDefineTemplate) { esclient.defineTemplate(templateName, template, function() { //let it be or plug an event emitter in there if (typeof done === 'function') { done(); } }); } else if (typeof done === 'function') { done(); } }); } else if (typeof done === 'function') { done(); } return esclient; } function makeESHelper(layout, config) { var logId = config.logId || function() {}; var typeName; if (typeof config.typeName === 'function') { typeName = config.typeName; } else { typeName = function(loggingEvent) { return config.typeName || 'nodejs'; }; } var indexName; var templateName; var template; if (typeof config.indexName === 'function') { indexName = config.indexName; } else if (typeof config.indexName === 'string') { indexName = function() { return config.indexName; }; } else { var prefix = config.indexNamePrefix || 'logstash-'; templateName = prefix + '*'; indexName = function() { function pad(n){ return n<10 ? '0'+n : n; } var date = new Date(); var vDay = pad(date.getUTCDate()); var vMonth = pad(date.getUTCMonth()+1); var vYearLong = pad(date.getUTCFullYear()); //'logstash-%{+YYYY.MM.dd}'; return prefix + vYearLong + '.' + vMonth + '.' + vDay; }; if (config.layout && config.layout.template !== false) { if (config.layout.type === 'logstash') { template = layouts.esTemplateMakers.logstash(templateName, config.layout.template); } else if (config.layout.type === 'simpleJson') { template = layouts.esTemplateMakers.simpleJson(templateName, config.layout.template); } } } return { indexName: indexName, typeName: typeName, logId: logId, template: template }; } exports.appender = createAppender; exports.configure = configure; exports.flushAll = bulk.flushAll; exports.logstashConnectFormatter = logstashConnectFormatter;