Winston: рдЯрдВрдХрдг рддреНрд░реБрдЯрд┐ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛.рд╕реНрдЯреНрд░реАрдо рд▓реЗрдЦрди рдХрд╛рд░реНрдп

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЬреВрди 2018  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: winstonjs/winston

рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:

  • _ winston рд╕рдВрд╕реНрдХрд░рдг?_

    • [ ] winston@2

    • [рдПрдХреНрд╕] winston@3

  • _ node -v рдЖрдЙрдЯрдкреБрдЯ:_ v9.8.0
  • _рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо?_ MacOS
  • _рднрд╛рд╖рд╛?_ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐: рд╕рдВрд╕реНрдХрд░рдг 2.9.1

рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?

logger.stream рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд▓реЗрдЦрди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореЗрд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ рд╣реИред

error TS2322: Type '{ write(message: any, encoding: any): void; }' 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'.

39             write(message: any, encoding: any) {
               ~~~~~

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХреНрдпрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ?

рдХреЛрдИ рдЧрд╝рд▓рддреА рдирд╣реАрдВ

рдЕрдиреНрдп

const options = {
            file: {
                level: "info",
                filename: `${appRoot}/logs/app.log`,
                handleExceptions: true,
                json: true,
                maxsize: 5242880, // 5MB
                maxFiles: 5,
                colorize: false,
            },
            console: {
                level: "debug",
                handleExceptions: true,
                json: false,
                colorize: true,
            },
        };

        this.logger = winston.createLogger({
            transports: [
                new winston.transports.File(options.file),
                new winston.transports.Console(options.console),
            ],
            exitOnError: false, // do not exit on handled exceptions
        });

        // create a stream object with a 'write' function that will be used by `morgan`
        this.logger.stream = {

            write(message: any, encoding: any) {
                // use the 'info' log level so the output will be picked up by both transports (file and console)
                this.logger.info(message);
            },
        };

рдореИрдВ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

https://www.digitalocean.com/community/tutorials/how-to-use-winston-to-log-node-js-applications

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк stream рд╕реАрдзреЗ рдЕрдкрдиреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВ:

// At the bottom of your winston config add

export const stream = {
  write: (message) => {
    logger.info(message);
  },
};

рдлрд┐рд░ рдЕрдкрдиреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рдмрджрд▓реЗрдВ:

import { stream } from 'config/winston.ts';
import * as morgan from 'morgan';

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

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЧреЛрдЪрд╛, рдЖрдк рдЕрдкрдиреА рдзрд╛рд░рд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

export const stream = {
  write: logger.info,
};

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдкрдХрд╛ рд▓реЙрдЧрд░ info рдлрд╝рдВрдХреНрд╢рди рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИ

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣реИ: stream(options?: any): NodeJS.ReadableStream; рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбреБрдкреНрд▓реЗрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрд╕рд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдкрд░ рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред

@DABH рдХреНрдпрд╛ рдЖрдк

рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк stream рд╕реАрдзреЗ рдЕрдкрдиреЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВ:

// At the bottom of your winston config add

export const stream = {
  write: (message) => {
    logger.info(message);
  },
};

рдлрд┐рд░ рдЕрдкрдиреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рдмрджрд▓реЗрдВ:

import { stream } from 'config/winston.ts';
import * as morgan from 'morgan';

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

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЧреЛрдЪрд╛, рдЖрдк рдЕрдкрдиреА рдзрд╛рд░рд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

export const stream = {
  write: logger.info,
};

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдкрдХрд╛ рд▓реЙрдЧрд░ info рдлрд╝рдВрдХреНрд╢рди рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

bertolo1988 picture bertolo1988  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amiram picture amiram  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mohanen picture mohanen  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Buzut picture Buzut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

anks333 picture anks333  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ