Skip to content

Custom loggers ​

To use your own logger, write an adapter that implements the Logger interface from @node-ts/bus-core, and give the bus a factory that creates it. This page uses winston; other loggers such as pino work the same way.

Logger has a method for each level, trace, debug, info, warn, error and fatal, each called with a message and an optional object of context:

ts
export class WinstonLogger implements Logger {
  private readonly logger: winston.Logger

  /**
   * @param name The name of the component that writes to this logger, such
   * as `@node-ts/bus-core:service-bus`
   */
  constructor(name: string) {
    this.logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      defaultMeta: { name },
      transports: [new winston.transports.Console()]
    })
  }

  trace(message: string, meta?: object): void {
    this.logger.silly(message, meta)
  }

  debug(message: string, meta?: object): void {
    this.logger.debug(message, meta)
  }

  info(message: string, meta?: object): void {
    this.logger.info(message, meta)
  }

  warn(message: string, meta?: object): void {
    this.logger.warn(message, meta)
  }

  error(message: string, meta?: object): void {
    this.logger.error(message, meta)
  }

  fatal(message: string, meta?: object): void {
    this.logger.error(message, { ...meta, fatal: true })
  }
}

Pass a factory to withLogger(). It's called with the name of each component that logs, so the adapter can include it:

ts
const bus = Bus.configure()
  // Called once for each component that logs
  .withLogger(name => new WinstonLogger(name))
  .build()

Transports and persistence adapters get their loggers from the same factory, so they log through your logger too.

See also ​

Released under the MIT License.