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.