user11656896
user11656896

Reputation:

How to use winston with typeorm?

I want all actions to be written to the log files. But this does not happen, the files themselves are created but they are always empty.

How to fix it? Or what am I doing wrong?

looger.ts:

import { LoggerOptions, createLogger, transports } from 'winston';

export const logger = createLogger(<LoggerOptions> {
    exitOnError: false,
    transports: [
        new transports.Console({
            level: 'debug'
        }),
        new transports.File({
            filename: './logs/errors.log',
            level: 'debug',
            maxsize: 1024 * 1024 * 10
        }),
        new transports.File({
            filename: './logs/logger.log',
            level: 'log'
        })
    ], exceptionHandlers: [
        new transports.File({
            filename: './logs/exceptions.log',
            level: 'debug',
            maxsize: 1024 * 1024 * 10
        })
    ]
});

server.ts:

import * as express from 'express'
import { Request, Response, NextFunction } from 'express';
import { logger } from './utils/logger';

class Server {
  public express;

  constructor () {
    this.express = express()
    this.log()
  }

  private log(): void {
    this.express.use((err: Error,  req: Request, res: Response, next: NextFunction) => {
        logger.error(err.stack);
        logger.log(res.stack);
    });
  }
}
export default new Server().express;

Upvotes: 3

Views: 2655

Answers (1)

zenbeni
zenbeni

Reputation: 7193

You have to define your own Logger implementation and then call your winston API within.

import { Logger, QueryRunner } from "typeorm";

export class TypeOrmLogger implements Logger {

    log(level: "log" | "info" | "warn", message: any, queryRunner?: QueryRunner): any {
        ...
    }

    logMigration(message: string, queryRunner?: QueryRunner): any {
        ...
    }

    logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner): any {
        ...
    }

    logQueryError(error: string, query: string, parameters?: any[], queryRunner?: QueryRunner): any {
        ...
    }

    logQuerySlow(time: number, query: string, parameters?: any[], queryRunner?: QueryRunner): any {
        ...
    }

    logSchemaBuild(message: string, queryRunner?: QueryRunner): any {
        ...
    }
}

Then you define your TypeOrmLogger as your logger in your connection options.

Upvotes: 1

Related Questions