diff --git a/lib/index.js b/lib/index.js index c50d581..70fa4cd 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,9 +3,10 @@ * log4js appender support */ const FluentSender = require('fluent-logger'); -const util = require('util'); const DEFAULT_TAG = 'log4js'; +require('es6-object-assign').polyfill(); + /** * * log4js.configure({ @@ -32,8 +33,10 @@ function fluentAppender(config, layout) { const logSender = FluentSender.createFluentSender(tag_prefix, options); const appender = function(loggingEvent) { - const data = util.format.apply(null, loggingEvent.data); - const rec = { + const data = loggingEvent.data[0]; + const extra = loggingEvent.data.splice(1); + + let rec = { timestamp: loggingEvent.startTime.getTime(), category: loggingEvent.categoryName, levelInt: loggingEvent.level.level, @@ -41,6 +44,11 @@ function fluentAppender(config, layout) { context: loggingEvent.context, data: data }; + + if (extra.length > 0) { + rec['extra'] = Object.assign.apply(null, extra); + } + if (options.levelTag !== false) { logSender.emit(loggingEvent.level.levelStr, rec); } else { @@ -50,6 +58,7 @@ function fluentAppender(config, layout) { appender.shutdown = (complete) => { logSender.end(null, null, complete); }; + ['addListener', 'on', 'once', 'removeListener', 'removeAllListeners', 'setMaxListeners', 'getMaxListeners', '_setupErrorHandler'].forEach((attr, i) => { appender[attr] = function() { return logSender[attr].apply(logSender, Array.prototype.slice.call(arguments)); diff --git a/package.json b/package.json index 88d01e1..4e34f63 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,9 @@ "fluentd" ], "dependencies": { - "log4js": ">= 2", - "fluent-logger": "" + "es6-object-assign": "^1.1.0", + "fluent-logger": "", + "log4js": ">= 2" }, "devDependencies": { "async": "", diff --git a/test/test.log4js.js b/test/test.log4js.js index 821a4f6..1886ee6 100644 --- a/test/test.log4js.js +++ b/test/test.log4js.js @@ -118,4 +118,37 @@ describe('log4js-fluent-appender', () => { done(); }); + it('should log extra', (done) => { + const tag_prefix = 'tag_prefix'; + const options = { + levelTag: false, + host: 'localhost', + port: 24224 + }; + const fakeSender = { + emit: td.function() + }; + td + .when(fluentLogger.createFluentSender(tag_prefix, options)) + .thenReturn(fakeSender); + const logger = getLogger(tag_prefix, options); + + logger.info('This is info message!', {extra1: true, extra2: false}, {extra3: true}); + + td.verify(fakeSender.emit({ + timestamp: td.matchers.anything(), + category: 'default', + levelInt: 20000, + levelStr: 'INFO', + context: {}, + data: 'This is info message!', + extra: { + extra1: true, + extra2: false, + extra3: true, + } + })); + done(); + }); + });