gremo / nest-winston

A Nest module wrapper form winston logger

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Extend the log methods

apss-pohl opened this issue · comments

commented

Hi,
first of all, thank you for your work on this package, i really like it.
I am using the https://github.com/gremo/nest-winston#replacing-the-nest-logger-also-for-bootstrapping approach ight now and would like to keep doing so.
However i would like to inject the current user into the log entries and i am not sure how to do that.
I inject a hard-coded configuration using the format option of a transport:

  format.printf(
        (info) =>
          filter('POSID:' + posId) +
          filter(info.timestamp) +
          filter(loggerName) +
          filter(info.level.toUpperCase()) +
          filter(info.message) +
          filter(info.context) +
          filter(info.stack) +
          filter(info.ms),
      ),

But the user is not known at bootstrap only per request base. I was wondering if i could e.g. extend the class and add a method wich i could call after bootstrap but within the modules.
Last resort would be to attach on every log message but it will be error prone.
Also happy for any other suggestion maybe i have overseen something obvious..
Thank you

Hi @apss-pohl! Thank you, really appreciated.

I'm not in the Nest world since a bit... but I'm afraid isn't possible.

Ideally I would do the following (if I remember correctly how it works):

1, Create a interceptor
2. Inject all you need (i.e. database service) to retrieve the user
3. Inject the Logger from @nestjs/common
4. Alter the Logger instance to have the context filled with the user

Point 4. isn't possible as the default logger doesn't provide anything to set the context (it's only a constructor parameter).

Hope I'm wrong.

Also have a look here: https://stackoverflow.com/a/68782441/220180

commented

Hi @gremo ,
thanks for your hints!
I played around a bit the last days and learned a lot. I found a way to archive what i like to do by adding a moduleReference into the config service of my auth strategy that holds the user. Using the format function of my transports i can add the current user to every log entry.
This only works for https://github.com/gremo/nest-winston#replacing-the-nest-logger but that is ok. On the bootstrap level i dont have a user anyway. I am simply having a second logger instance there using similar configuration.

But i noticed one downside using it this way: I cant change the context name or logger name once i set one.
E.g. in some modules i used to have 2 instances of a logger to separate concerns. If i try to do the same now i always receive the context of the first one in the logs:

  constructor(
    private settingsService: SettingsService,
    @Inject(WINSTON_MODULE_NEST_PROVIDER) private readonly logger: WinstonLogger,
    @Inject(WINSTON_MODULE_NEST_PROVIDER) private readonly renderLogger: WinstonLogger,
  ) {
    this.logger.setContext(CommonController.name);
    this.renderLogger.setContext('RENDER');
  }

Any idea how to work around here?
Thank you!