winston: Log / info methods don't respect metadata overrides

Please tell us about your environment:

  • winston version?
    • winston@2
    • winston@3
  • node -v outputs: v10.14.2
  • Operating System? (Windows, macOS, or Linux) Windows and Linux
  • Language? all

What is the problem?

If I create a root logger with some default metadata property and a format string containing metadata, then create a child logger, calling child.info('test') ignores the metadata set on the child. If I call child.log({ level: 'info, message: 'test' }) the metadata is honored.

I also noticed that this behavior is broken even on the root logger. If you use defaultMeta, it will overwrite data in your info object.

What do you expect to happen instead?

I expect the child behave consistently when calling .log and .info

Other information

There seem to be a few problems here.

First Problem: When you create a logger with default metadata, it is stored as defaultMeta. When you call log(info), the default metaData is applied onto info, effectively overwriting whatever you passed.

logger.log({ level: 'debug', message: 'root log', component: 'ROOT2' });
// => [debug][ROOT]: root log
_addDefaultMeta(msg) {
    if (this.defaultMeta) {
      Object.assign(msg, this.defaultMeta); // msg gets overwritten with defaultMeta
    }
  }
}

this function should probably assign in reverse order to a blank object and return the value…

Second Problem: When calling .info(), the same happens:

  logger.info({ message: 'root info', component: 'ROOT2' });
 // => [info][ROOT]: root info

Third Problem: When creating a child logger which overrides component, if you call .info on the child, the metadata from the root is used instead. This is because the child() method only overrides write()

Please let me know if you need a full reproduction. I can try to provide one.

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 8
  • Comments: 16 (10 by maintainers)

Most upvoted comments

This bug is affecting me as well. The problem is, that I cannot overwrite defaultMeta.

I have created a PR that I believe will address your issue, as well as mine @kbirger. Please test it and let me know if it does not function as expected.

Hey hey 😃 The more help the merrier — I think the problem is when this gets down to one maintainer it’s not really sustainable (especially when that maintainer gets buried by work/life for a year - 2020 was interesting 😬). If you are interested in being a maintainer please email me, my email is $(npm info yadeep maintainers.email).

For this issue, if you’d like to open your PR and maybe re-state/summarize the issue and the fix, @wbt @fearphage and I can take a look? They have been doing more Node and Winston stuff than I have recently so they should be able to help offer useful comments. I do think that this is one of maybe 1-4 major issues with Winston currently, and they’ve already solved 1 or 2 of those issues, so we are well on our way to getting Winston 3.x to where it needs to be (there are always minor improvements but I’m not so concerned about those…)

Hey all, finally working through this again. Reviewed the comments on the PR and have decided I’ll likely do this in phases. Updated branches my master branch, going back checking test coverage for logger.js first. Will be updating coverage where applicable before picking up the resolution for this issue to ensure I don’t break anything that @DABH was worried about in regards to breaking functionality.

@mpetrunic I will be referencing your PR as well.