diff --git a/lib/winston/logger.js b/lib/winston/logger.js index dc7866854..be002b648 100644 --- a/lib/winston/logger.js +++ b/lib/winston/logger.js @@ -18,14 +18,6 @@ const Profiler = require('./profiler'); const { warn } = require('./common'); const config = require('./config'); -/** - * Captures the number of format (i.e. %s strings) in a given string. - * Based on `util.format`, see Node.js source: - * https://github.com/nodejs/node/blob/b1c8f15c5f169e021f7c46eb7b219de95fe97603/lib/util.js#L201-L230 - * @type {RegExp} - */ -const formatRegExp = /%[scdjifoO%]/g; - /** * TODO: add class description. * @type {Logger} @@ -226,26 +218,21 @@ class Logger extends Transform { return this; } - const [meta] = splat; + // if the last argument is an object, treat it as meta and merge it into info + const [meta] = splat.slice(-1); if (typeof meta === 'object' && meta !== null) { - // Extract tokens, if none available default to empty array to - // ensure consistancy in expected results - const tokens = msg && msg.match && msg.match(formatRegExp); - - if (!tokens) { - const info = Object.assign({}, this.defaultMeta, meta, { - [LEVEL]: level, - [SPLAT]: splat, - level, - message: msg - }); + const info = Object.assign({}, this.defaultMeta, meta, { + [LEVEL]: level, + [SPLAT]: splat, + level, + message: msg + }); - if (meta.message) info.message = `${info.message} ${meta.message}`; - if (meta.stack) info.stack = meta.stack; + if (meta.message) info.message = `${info.message} ${meta.message}`; + if (meta.stack) info.stack = meta.stack; - this.write(info); - return this; - } + this.write(info); + return this; } this.write(Object.assign({}, this.defaultMeta, { diff --git a/test/logger.test.js b/test/logger.test.js index 0d21d3fa1..22a3c1a7b 100755 --- a/test/logger.test.js +++ b/test/logger.test.js @@ -788,15 +788,29 @@ describe('Logger (logging exotic data types)', function () { const logged = []; const logger = helpers.createLogger(function (info, enc, next) { logged.push(info); + assume(info.extra).equals(true); assume(info.label).equals(undefined); next(); if (logged.length === 1) done(); - }); + }, format.splat()); logger.info('Hello %j', { label: 'world' }, { extra: true }); }); + it(`.info('Literal "%c"') does not drop meta props when splat formatter not used`, function (done) { + const logged = []; + const logger = helpers.createLogger(function (info, enc, next) { + logged.push(info); + assume(info.label).equals('world'); + next(); + + if (logged.length === 1) done(); + }); + + logger.info('Literal "%c"', { label: 'world' }); + }); + it(`.info('Hello') and .info('Hello %d') preserve meta with splat format`, function (done) { const logged = []; const logger = helpers.createLogger(function (info, enc, next) {