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(); }); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy