Winston: рдХрдВрд╕реЛрд▓ рд▓реЙрдЧрд┐рдВрдЧ рд░рдВрдЧреАрди рдирд╣реАрдВ рд╣реИред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдирд╡ре░ 2017  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: winstonjs/winston

рдореИрдВ рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд░рдВрдЧреАрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рд╕рднреА рд╕рдорд╛рди (рд╕рдлреЗрдж) рд░рдВрдЧ рд╣реИред рдореИрдВ 3.0.0-рдЖрд░рд╕реА1 рдкрд░ рд╣реВрдВред

const winston = require('winston');
const logLevels = {
  levels: {
    error: 0,
    warn: 1,
    info: 2,
    http: 3,
    sql: 4,
    debug: 5
  },
  colors: {
    error: "red",
    warn: "darkred",
    info: "black",
    http: "green",
    sql: "blue",
    debug: "gray"
  }
};
winston.addColors(logLevels);
const logger = winston.createLogger({...});
logger.add(new winston.transports.Console({colorize: true}));

рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕реБрдЭрд╛рд╡ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рд╡рд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

logger.add(new winston.transports.Console({format: winston.format.combine(formatter, winston.format.colorize())}));

рдзрдиреНрдпрд╡рд╛рдж,
рдЕрд▓рд╡рд╛рд░реЛ

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

рдореИрдВ рд▓реЙрдЧрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf(info => `${info.timestamp} [${info.level}]: ${info.message}`),
  );

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ JSON рддрд░реНрдХреЛрдВ рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВред

рдпрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ:

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf((info) => {
      const {
        timestamp, level, message, ...args
      } = info;

      const ts = timestamp.slice(0, 19).replace('T', ' ');
      return `${ts} [${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
    }),
  );

screen shot 2017-11-13 at 10 55 05 am

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

рдореИрдВ рд▓реЙрдЧрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf(info => `${info.timestamp} [${info.level}]: ${info.message}`),
  );

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ JSON рддрд░реНрдХреЛрдВ рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВред

рдпрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ:

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf((info) => {
      const {
        timestamp, level, message, ...args
      } = info;

      const ts = timestamp.slice(0, 19).replace('T', ' ');
      return `${ts} [${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
    }),
  );

screen shot 2017-11-13 at 10 55 05 am

рджреЛ рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рд░рдВрдЧреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдзрдиреНрдпрд╡рд╛рдж @Xeoncross !

рд╡рд┐рдВрд╕реНрдЯрди рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рд░рдВрдЧреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрдВрд╕реЛрд▓ рднреА рдорд┐рд▓рд╛ ...
рдореИрдВ рдЕрдЧрд▓реЗ рдкрд░рд┐рд╡рд╣рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛:

new winston.transports.Console({
  format: winston.format.simple()
})

рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛:

new winston.transports.Console({
  format: winston.format.combine(
            winston.format.simple(),
            winston.format.colorize()
          )
})

рдФрд░ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рд╛ред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд░рдВрдЧреАрди рдкреНрд░рд╛рд░реВрдк рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ 1 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рд░рдВрдЧ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ

new winston.transports.Console({
  format: winston.format.combine(
            winston.format.colorize(),
            winston.format.simple()
          )
})

рдзрдиреНрдпрд╡рд╛рдж @abrakadobr ! рдХрд┐ рдЪрд╛рд▓ рдЪрд▓реАред

рдпрд╣рд╛рдБ рдХреБрдЫ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдХреЛрдИ рд░рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд░рдВрдЧ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдлрд╝реАрд▓реНрдб рдПрдиреНрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдХреНрд╕рдкреНрд░реЗрд╕рдЬ рдРрдк рдореЗрдВ рд╡рд┐рдВрд╕реНрдЯрди рдФрд░ рдореЙрд░реНрдЧрди рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж @Xeoncross! рдореЗрд░реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ winton.format.colorize() рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛ред

рдореБрдЭреЗ рдирдпрд╛ рд▓рдЪреАрд▓рд╛рдкрди рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдорд┐рд▓реЗрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИред рд╣рдордореЗрдВ рд╕реЗ рдЬреЛ winston.cli() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧ-рдПрди-рдкреНрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░реЗрдЧрд╛, рдЬреЛ @Xeoncross рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИред

рдХрд┐рд╕реА рдХреЛ рднреА рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдПрдХ рд░рд┐рд▓реАрдЬ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрдк all рдХреЛ colorize рдкрд░ рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдкреВрд░реЗ рд▓реЙрдЧ рдХреЛ рд░рдВрдЧреАрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

colorize({ all: true })

@markhealey рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдиреЗ package.json рд╕реЗ рд╡рд┐рдВрд╕реНрдЯрди рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рдкрдврд╝рд╛ред рдзрдиреНрдпрд╡рд╛рдж: +1:

Thx @Xeoncrossред рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://github.com/winstonjs/logform/blob/master/timestamp.js ред рдЖрдк рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ format рдСрдкреНрдЯ рдкрд░рдо рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдордп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ

format.combine(
    format.colorize(),
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.align(),
    format.printf(info => {
        const { timestamp, level, message, ...extra } = info;

        return `${timestamp} [${level}]: ${message} ${
            Object.keys(extra).length ? JSON.stringify(extra, null, 2) : ''
        }`;
    }),
)

format.colorize({all:true} рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рд░рдВрдЧреАрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг рд╣реИ:

const colorizer = winston.format.colorize();

const logger = winston.createLogger({
  level: 'debug',
  format: combine(
    winston.format.timestamp(),
    winston.format.simple(),
    winston.format.printf(msg => 
      colorizer.colorize(msg.level, `${msg.timestamp} - ${msg.level}: ${msg.message}`)
    )
  ),
  transports: [
    new transports.Console(),
  ]

});

рдореЗрд░реЗ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓реЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ

рдзрдиреНрдпрд╡рд╛рдж @abrakadobr , рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

@tommuhm рдореБрдЭреЗ рдЕрдм рджреЛрд╖ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред colorize рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг printf рдХреЛ рд░рдВрдЧреАрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рд╕рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ?

const { createLogger, format, transports } = require('../');

const logger = createLogger({
  level: 'debug',
  format: format.combine(
    format.timestamp(),
    format.simple(),
    format.printf(info => `${info.timestamp} - ${info.level}: ${info.message}`),
    format.colorize({ all: true })
  ),
  transports: [
    new transports.Console(),
  ]
});

logger.error('wowza');

рдореБрд╢реНрдХрд┐рд▓ рдмрд┐рдЯ рдореЗрдВ colorizer рдЬреНрдЮрд╛рдд рд╣реИ рдЬрдм рдПрдХ info рдХреЛ "рдХреНрд░рдордмрджреНрдз" рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдиреА рдЬрдм info[MESSAGE] рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ)ред рдлреЙрд▓реЛ-рдЕрдк рдкреАрдЖрд░ рдЬрд▓реНрдж рд╣реА logform - рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@Xeoncross рд╣рдо рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, colorize, printf } = format;

const level = process.env.LOG_LEVEL || 'debug';

const myFormat = printf(({ level, message, label, timestamp }) => {
    return `${timestamp} ${level}: ${message}`;
});

const logger = createLogger({
    format: combine(colorize(), timestamp(), myFormat),
    transports: [new transports.Console()]
});

рд╕рдВрджрд░реНрдн: https://www.npmjs.com/package/winston#using -custom-logging-levels

рдореИрдВ рдХреНрд▓рд╛рдЙрдбрд╡реЙрдЪ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрд╕реНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд░рдВрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рд░рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ .. рдореИрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдиреАрдЪреЗ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ

const winston = require('winston');
const {transports, format, createLogger  } = winston;
const { combine,errors,timestamp} = format;

const colorizer = winston.format.colorize();


const logger = createLogger({
    level:  process.env.LOG_LEVEL,
    prettyPrint : true,
    format: combine(
        winston.format.timestamp(),
        winston.format.simple(),
        winston.format.printf(msg =>
            colorizer.colorize(msg.level, `${msg.timestamp} - ${msg.level}: ${msg.message}`)
        )
    ),
    transports: [
        new transports.Console()
    ]
});

module.exports = {logger};

рдФрд░ рдХреНрд▓рд╛рдЙрдбрд╡реЙрдЪ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ

[34m2019-08-22T13:00:03.325Z - debug: res by id: [
{
    "isActive": true,
    "value": "fNUMheWiwXayKsaYCbUeA7Gg7BtEPIUbakB56XH1",
    "id": "oehlwqlcve",
    "userId": "6b347b41-ddef-4842-83a0-1cd5ca358482"
}
][39m

рдпрд╣ [39 рдореА рд░рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдХреЛрдИ рдЙрдкрд╛рдп?

-22рдЯреА13:00:03.325рдЬреЗрдб - рдбрд┐рдмрдЧ: рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд░реЗрд╕: [

рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛?

-22рдЯреА13:00:03.325рдЬреЗрдб - рдбрд┐рдмрдЧ: рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд░реЗрд╕: [

рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛?

рдЙрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛?

@Xeoncross рд╣рдо рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, colorize, printf } = format;

const level = process.env.LOG_LEVEL || 'debug';

const myFormat = printf(({ level, message, label, timestamp }) => {
  return `${timestamp} ${level}: ${message}`;
});

const logger = createLogger({
  format: combine(colorize(), timestamp(), myFormat),
  transports: [new transports.Console()]
});

рд╕рдВрджрд░реНрдн: https://www.npmjs.com/package/winston#using -custom-logging-levels

рдореИрдХреЛрдЬрд╝ рдкрд░ рдЖрдИрдЯрд░реНрдо рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЪрд╛рд▓ рдереА

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ:
https://stackoverflow.com/questions/51012150/winston-3-0-colorize-whole-output-on-console

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

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

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

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

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

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

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