---
url: https://node-ts.github.io/bus/guide/loggers/custom-loggers.md
description: >-
  Send the bus' logs to your own logger, such as winston or pino, with an
  adapter.
---

# 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](https://www.npmjs.com/package/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

* [Loggers](/guide/loggers)
* [`Logger`](/api/bus-core/interfaces/Logger) in the API reference
