diff --git a/lib/appenders/logstashUDP.js b/lib/appenders/logstashUDP.js index eee85aa2..206b72d8 100755 --- a/lib/appenders/logstashUDP.js +++ b/lib/appenders/logstashUDP.js @@ -2,6 +2,7 @@ const dgram = require('dgram'); const util = require('util'); +const debug = require('debug')('log4js:logstashUDP'); function sendLog(udp, host, port, logObject) { const buffer = Buffer.from(JSON.stringify(logObject)); @@ -9,12 +10,12 @@ function sendLog(udp, host, port, logObject) { /* eslint no-unused-vars:0 */ udp.send(buffer, 0, buffer.length, port, host, (err, bytes) => { if (err) { - console.error('log4js.logstashUDP - %s:%p Error: %s', host, port, util.inspect(err)); + debug('%s:%p Error: %s', host, port, util.inspect(err)); + process.emit('log4jsError', 'logstashUDP', err, logObject); } }); } - function logstashUDP(config, layout) { const udp = dgram.createSocket('udp4'); const type = config.logType ? config.logType : config.category; diff --git a/test/tap/logstashUDP-test.js b/test/tap/logstashUDP-test.js index 394b865b..68befbdd 100644 --- a/test/tap/logstashUDP-test.js +++ b/test/tap/logstashUDP-test.js @@ -6,11 +6,21 @@ const sandbox = require('sandboxed-module'); function setupLogging(category, options) { const udpSent = {}; const socket = { closed: false }; + let errorsOn = false; const fakeDgram = { createSocket: function () { return { send: function (buffer, offset, length, port, host, callback) { + if (errorsOn) { + process.emit( + 'log4jsError', 'logstashUDP', + new Error('failed to send event'), + JSON.parse(buffer.toString()) + ); + return; + } + udpSent.date = new Date(); udpSent.host = host; udpSent.port = port; @@ -40,11 +50,16 @@ function setupLogging(category, options) { categories: { default: { appenders: ['logstash'], level: 'trace' } } }); + function setErrorsOn(val) { + errorsOn = val; + } + return { logger: log4js.getLogger(category), log4js: log4js, results: udpSent, - socket: socket + socket: socket, + setErrorsOn: setErrorsOn }; } @@ -267,5 +282,49 @@ test('logstashUDP appender', (batch) => { }); }); + batch.test('emit errors', (t) => { + const setup = setupLogging('myLogger', { + host: '127.0.0.1', + port: 10001, + type: 'logstashUDP', + category: 'myLogger', + layout: { + type: 'dummy' + } + }); + + // handle errors + let errorEmitted = false; + process.on('log4jsError', (adapter, err, logEvent) => { + t.equal(adapter, 'logstashUDP'); + t.equal(err.message, 'failed to send event'); + t.equal(logEvent.level, 'INFO'); + errorEmitted = true; + }); + + // Send a message that should succeed + let msg = 'this message should work'; + setup.logger.info(msg); + let json = JSON.parse(setup.results.buffer.toString()); + t.equal(json.message, msg); + + // Send a message that should fail + setup.results.buffer = null; + setup.setErrorsOn(true); + msg = 'this message should not work'; + setup.logger.info(msg); + t.notOk(setup.results.buffer); + t.true(errorEmitted); + + // Send another message that should succeed + setup.setErrorsOn(false); + msg = 'this message should work too'; + setup.logger.info(msg); + json = JSON.parse(setup.results.buffer.toString()); + t.equal(json.message, msg); + + t.end(); + }); + batch.end(); });