diff --git a/lib/appenders/loggly.js b/lib/appenders/loggly.js index 085f8b3..b2da578 100644 --- a/lib/appenders/loggly.js +++ b/lib/appenders/loggly.js @@ -2,8 +2,9 @@ var layouts = require('../layouts') , loggly = require('loggly') , os = require('os') -, passThrough = layouts.messagePassThroughLayout; - +, passThrough = layouts.messagePassThroughLayout +, openRequests = 0 +, shutdownCB; function isAnyObject(value) { return value !== null && (typeof value === 'object' || typeof value === 'function'); @@ -68,12 +69,26 @@ function logglyAppender(config, layout) { var msg = layout(loggingEvent); + openRequests++; + client.log({ msg: msg, level: loggingEvent.level.levelStr, category: loggingEvent.categoryName, hostname: os.hostname().toString(), - }, additionalTags); + }, additionalTags, function (error, result) { + if (error) { + console.error("log4js.logglyAppender - error occurred: ", error); + } + + openRequests--; + + if (shutdownCB && openRequests === 0) { + shutdownCB(); + + shutdownCB = undefined; + } + }); }; } @@ -85,6 +100,15 @@ function configure(config) { return logglyAppender(config, layout); } +function shutdown (cb) { + if (openRequests === 0) { + cb(); + } else { + shutdownCB = cb; + } +} + exports.name = 'loggly'; exports.appender = logglyAppender; exports.configure = configure; +exports.shutdown = shutdown; diff --git a/lib/log4js.js b/lib/log4js.js index 653d4bc..25e89a2 100644 --- a/lib/log4js.js +++ b/lib/log4js.js @@ -186,11 +186,16 @@ function getLogger (loggerCategoryName) { } /** - * args are appender, then zero or more categories + * args are appender, optional shutdown function, then zero or more categories */ function addAppender () { var args = Array.prototype.slice.call(arguments); var appender = args.shift(); + //check for a shutdown fn + if (args.length > 0 && typeof args[0] === 'function') { + appenderShutdowns[appender] = args.shift(); + } + if (args.length === 0 || args[0] === undefined) { args = [ ALL_CATEGORIES ]; } @@ -232,6 +237,9 @@ function addAppenderToCategory(appender, category) { } function clearAppenders () { + //if we're calling clearAppenders, we're probably getting ready to write + //so turn log writes back on, just in case this is after a shutdown + loggerModule.enableAllLogWrites(); appenders = {}; for (var logger in loggers) { if (hasLogger(logger)) { diff --git a/test/vows/logglyAppender-test.js b/test/vows/logglyAppender-test.js index d5dc3c4..ce7c6a6 100644 --- a/test/vows/logglyAppender-test.js +++ b/test/vows/logglyAppender-test.js @@ -12,10 +12,11 @@ function setupLogging(category, options) { createClient: function(options) { return { config: options, - log: function(msg, tags) { + log: function(msg, tags, cb) { msgs.push({ msg: msg, - tags: tags + tags: tags, + cb: cb }); } }; @@ -49,7 +50,10 @@ function setupLogging(category, options) { } }); - log4js.addAppender(logglyModule.configure(options), category); + log4js.addAppender( + logglyModule.configure(options), + logglyModule.shutdown, + category); return { logger: log4js.getLogger(category), @@ -107,4 +111,31 @@ vows.describe('log4js logglyAppender').addBatch({ assert.deepEqual(topic.results[0].tags, []); } } +}).addBatch({ + 'with shutdown callback': { + topic: function() { + var setup = setupTaggedLogging(); + + setup.logger.log('trace', 'Log event #1', 'Log 2', { + tags: ['tag1', 'tag2'] + }); + + return setup; + }, + 'after the last message has been sent': { + topic: function (topic) { + var that = this; + + log4js.shutdown(this.callback); + topic.results[0].cb(); + + // setTimeout(function() { + // that.callback(new Error('Shutdown callback has not been called')); + // }, 0); + }, + 'calls `log4js.shutdown`s callback function.': function(error, result) { + assert.equal(error, undefined); + } + } + } }).export(module);