nest-winston icon indicating copy to clipboard operation
nest-winston copied to clipboard

Extend the log methods

Open apss-pohl opened this issue 1 year ago • 2 comments

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

apss-pohl avatar Jul 12 '22 17:07 apss-pohl

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

gremo avatar Jul 13 '22 13:07 gremo

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!

apss-pohl avatar Jul 15 '22 07:07 apss-pohl

This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.

github-actions[bot] avatar Jun 29 '23 01:06 github-actions[bot]

This issue was closed because it has been stalled for 7 days with no activity.

github-actions[bot] avatar Jul 06 '23 01:07 github-actions[bot]