Packages

winston

3.19.0 · 7 Dec 2025MIT36.6M / weekRepositoryHomepagenpmAtom feed

Your version

3.2.0

26 Jan 2019Where it was published

3.19.0 is the newest release of 3.x.

In short

6 new9 fixed1 internal

Release note

v3.2.0 / 2019-01-26

Sorry it too so long edition

NOTE: this was our first release using Github Projects. See the
3.2.0 Release Project.

New Features!

Bug Fixes

New splat behavior

  • [#1552], (@indexzero) Consistent handling of meta with (and without)
    interpolation in winston and logform.

  • [#1499], (@DABH) Provide all of SPLAT to formats (Fixes [#1485]).

  • [#1485], (@mpabst) Fixing off-by-one when using both meta and splat.

Previously splat would have added a meta property for any additional
info[SPLAT] beyond the expected number of tokens.

As of logform@2.0.0, format.splat assumes additional splat paramters
(aka "metas") are objects and merges enumerable properties into the info.
e.g. BE ADVISED previous "metas" that were not objects will very likely
lead to odd behavior. e.g.

const { createLogger, format, transports } = require('winston');
const { splat } = format;
const { MESSAGE, LEVEL, SPLAT } = require('triple-beam');

const logger = createLogger({
  format: format.combine(
    format.splat(),
    format.json()
  ),
  transports: [new transports.Console()]
});

// Expects two tokens, but four splat parameters provided.
logger.info(
  'Let us %s for %j',   // message
  'objects',           // used for %s
  { label: 'sure' },   // used for %j
  'lol', ['ok', 'why'] // Multiple additional meta values
);

// winston < 3.2.0 && logform@1.x behavior:
// Added "meta" property.
//
// { level: 'info',
//   message: 'Let us objects for {"label":"sure"}',
//   meta: ['lol', ['ok', 'why']],
//   [Symbol(level)]: 'info',
//   [Symbol(message)]: 'Let us %s for %j',
//   [Symbol(splat)]: [ 'objects', { label: 'sure' } ] }

// winston >= 3.2.0 && logform@2.x behavior: Enumerable properties
// assigned into `info`. Since **strings and Arrays only have NUMERIC
// enumerable properties we get this behavior!**
//
// { '0': 'ok',
//   '1': 'why',
//   '2': 'l',
//   level: 'info',
//   message: 'Let us objects for {"label":"sure"}',
//   [Symbol(level)]: 'info',
//   [Symbol(message)]: 'Let us %s for %j',
//   [Symbol(splat)]: [ 'objects', { label: 'sure' } ] }