Как вы должны создать поток Winger logger для Morgan в TypeScript - PullRequest
0 голосов
/ 26 апреля 2018

Как правильно создать регистратор Winston в TypeScript, который будет регистрировать экспресс-регистрацию промежуточного программного обеспечения Morgan? Я нашел несколько примеров JavaScript, но у меня возникли проблемы с преобразованием их в TypeScript, потому что я получаю сообщение об ошибке Type '{ write: (message: string, encoding: any) => {}; logger: any; }' is not assignable to type '(options?: any) => ReadableStream'. Object literal may only specify known properties, and 'write' does not exist in type '(options?: any) => ReadableStream'.

Вот мой код:

import { Logger, transports } from 'winston';

// http://tostring.it/2014/06/23/advanced-logging-with-nodejs/
// https://www.loggly.com/ultimate-guide/node-logging-basics/

const logger = new Logger({
    transports: [
        new (transports.Console)({
            level: process.env.NODE_ENV === 'production' ? 'error' : 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        }),
        new (transports.File)({
            filename: 'debug.log', level: 'info',
            handleExceptions: true,
            json: true,
            colorize: false
        })
    ],
    exitOnError: false,
});



if (process.env.NODE_ENV !== 'production') {
    logger.debug('Logging initialized at debug level');
}



// [ts]
// Type '{ write: (message: string, encoding: any) => {}; logger: any; }' is not assignable to type '(options?: any) => ReadableStream'.
//   Object literal may only specify known properties, and 'write' does not exist in type '(options?: any) => ReadableStream'.
logger.stream = {
    write: function (message: string, encoding: any) {
        logger.info(message);
    };
}


export default logger;

Я смог обойти эту проблему, настроив свой код на использование const winston = require('winston');, но хотел бы знать, как вы должны делать это, поддерживая типы?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Спасибо @estus, который помог мне пройти, где я был повешен. Вот решение, которое я использовал в итоге:

import { Logger, transports } from 'winston';
import stream from 'stream';
import split from 'split';

// http://tostring.it/2014/06/23/advanced-logging-with-nodejs/
// https://www.loggly.com/ultimate-guide/node-logging-basics/

const logger = new Logger({
    transports: [
        new (transports.Console)({
            level: process.env.NODE_ENV === 'production' ? 'error' : 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        }),
        new (transports.File)({
            filename: 'debug.log', level: 'info',
            handleExceptions: true,
            json: true,
            colorize: false
        })
    ],
    exitOnError: false,
});

if (process.env.NODE_ENV !== 'production') {
    logger.debug('Logging initialized at debug level');
}

logger.stream = split().on('data', function (message: string) {
    logger.info(message);
});

export default logger;

В конечном счете, эта проблема дала мне окончательное решение - https://github.com/expressjs/morgan/issues/70

0 голосов
/ 19 августа 2018

В конечном итоге я выбрал это решение. Я создал класс с одним методом с именем write

export class LoggerStream {
    write(message: string) {
        logger.info(message.substring(0, message.lastIndexOf('\n')));
    }
}

затем при добавлении в экспресс я создал экземпляр класса:

 app.use(morgan('combined', { stream: new LoggerStream() }));

Это хорошо подходит для моей ситуации

0 голосов
/ 26 апреля 2018

stream ожидается, что это фабричная функция, которая возвращает поток, а не сам поток.

Ожидается, что поток будет реальным читаемым потоком, а не объектом, имитирующим его.

Поскольку он также должен быть доступен для записи, это должен быть дуплекс:

logger.stream = (options?: any) => new stream.Duplex({
    write: function (message: string, encoding: any) {
        logger.info(message);
    }
});

Это решение, предлагаемое типами Winston TS. Я не могу подтвердить, работает ли он правильно.

...