Winston: рддреНрд░реБрдЯрд┐ рд▓реЙрдЧрд┐рдВрдЧ рд╡рд┐рдзрд┐ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рддреНрд░реБрдЯрд┐ рдЙрджрд╛рд╣рд░рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ

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

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

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

    • [ ] winston@2

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

  • _ node -v рдЖрдЙрдЯрдкреБрдЯ:_ v8.11.3

  • _рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо?_ рд▓рд┐рдирдХреНрд╕

  • _рднрд╛рд╖рд╛?_ рд╕рднреА

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

logger.error рдЬрд┐рд╕реЗ Error рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, message рдФрд░ stack рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд▓реЙрдЧ рдкрд░реАрдХреНрд╖рдг error ред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

const winston = require('winston');

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

    if (level.indexOf('error') !== -1) {
      console.log(typeof message, JSON.stringify(message));
    }

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

const transports = [new winston.transports.Console({
  level: 'debug',
  format: alignedWithColorsAndTime
})];

const logger = winston.createLogger({
  level: 'debug',
  transports
});

try {
  logger.info('aaaaa');
  logger.debug('bbbb');
  logger.error('eeee');

  throw new Error('Scary error');
} catch (error) {
  logger.error(error);
}

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

рдХрдо рд╕реЗ рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ - рдвреЗрд░ рдХреЗ рд╕рд╛рдеред

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

рддреЛ, рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдерд╛ред рдпрд╣ рдЕрднреА рд╡рд┐рдВрд╕реНрдЯрди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ [email protected] рдореЗрдВ рд╣реИ , рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ metadata рдФрд░ json рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рддреЛ, рд╣рд╛рдБ, рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБред рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

const winston = require('winston');
const { format } = require('logform');

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata(),
    format.json(),
  ),
  transports: [ new winston.transports.Console() ],
});

logger.error(new Error(FakeError));

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

рдпрд╣ printf рдлреЙрд░реНрдореЗрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, simple рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдлреЙрд░реНрдореЗрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдШрдЯрдирд╛ рдпрд╣ рдЦрд╛рд▓реА рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИред

рд╕рдВрднрд╡рдд: рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджрд╛ #1422

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдореБрдЭреЗ рд╕реНрд╡рдпрдВ logger.error рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рд╛:

  logger.error = err => {
      if (err instanceof Error) {
        logger.log({ level: 'error', message: `${err.stack || err}` });
      } else {
        logger.log({ level: 'error', message: err });
      }
    };

@gtsec рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рд╡рд╣реА рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдирдИ рд╡рд┐рдзрд┐ рдирд╛рдо .exception рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ wintson-transport рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП https://github.com/winstonjs/winston-transport/issues/31 рджреЗрдЦреЗрдВ рдФрд░ https://github.com/winstonjs/winston-transport/pull/ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП

рдПрдХ рдирдореВрдирд╛ рд░реЗрдкреЛ рдореЗрдВ рдЬрд╣рд╛рдВ рдореИрдВ winston-graylog2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ winston@3x рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рдлреЙрд░реНрдореЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред

const errorFormatter = format((info, opts) => {
  let formatted = {};

  if (info instanceof Error) {
    // An error object is not 100% like a normal object, so
    // we have to jump through hoops to get needed info out
    // of error objects for logging.
    formatted = Object.assign(formatted, info);
    formatted.message = info.stack;
  } else {
    formatted = info;
  }

  return formatted;
});

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕реБрд╕рдВрдЧрдд рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЙрдЧрд░ рдХреА рддреНрд░реБрдЯрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрдЬрд╛рдп рдХрд╕реНрдЯрдо рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рдЯреВ-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЕрд╕рдВрдЧрдд) рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд/рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рд╕реБрдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╣реИрдХреА) )

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

https://github.com/winstonjs/logform#errors

рдЙрджрд╛рд╣рд░рдг?

рддреЛ, рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдерд╛ред рдпрд╣ рдЕрднреА рд╡рд┐рдВрд╕реНрдЯрди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ [email protected] рдореЗрдВ рд╣реИ , рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ metadata рдФрд░ json рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рддреЛ, рд╣рд╛рдБ, рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБред рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

const winston = require('winston');
const { format } = require('logform');

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata(),
    format.json(),
  ),
  transports: [ new winston.transports.Console() ],
});

logger.error(new Error(FakeError));

рд╕реНрд▓реАрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб @ рдЬреЗрд░реЗрдореА-рдЬреЗ-рдПрдХрд╕реЛ

рдЗрд╕реЗ #1576 рдХреЗ рдХрд╛рд░рдг рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ред

рд╕реНрд╡рд░реВрдкрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

const winston = require('winston');
const { format } = winston;

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata(),
    format.json(),
  ),
  transports: [ new winston.transports.Console() ],
});

logger.error(new Error('FakeError'));

рд╣рд╛рдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдВрддрддрдГ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓реЙрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ!

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреНрдпрд╛рджрд╛рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд░рд▓ () рдЬреИрд╕реЗ рдкрд╛рда рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрджреНрднреБрдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╛рдирдХ, рдкрд░реЗрд╢рд╛рдиреА рдореБрдХреНрдд рдФрд░ рд░рд╛рдп рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рд╣реЛред

рдореИрдВ рдПрдХ рдЖрдХрд╛рд░-рдлрд┐рдЯ-рд╕рдм-рдХрд░-рд╕рдм-рдХреЗ-рдореЗрд░реЗ-рдореЗрдХ-рдореЗрдХ-рдЗрдЯ-рдореИрдЬрд┐рдХ-рди-рдореЗрдХ-рдореА-рдерд┐рдВрдХ рдкреНрд░рд╛рд░реВрдк рдХреА рдЗрдЪреНрдЫрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдореЗрдВ рдЧрд┐рд░рдирд╛ рдПрдХ рдЖрд╕рд╛рди рдЬрд╛рд▓ рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╡рд┐рдВрд╕реНрдЯрди @ 2 рдФрд░ рдкреВрд░реНрд╡ рд░рд┐рд▓реАрдЬ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЕрдиреНрдп рд▓реЙрдЧрд┐рдВрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрддрдирд╛ рднрдпрд╛рдирдХ рдкреНрд░рджрд░реНрд╢рди рдерд╛ред рдЗрд╕рдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдп рдФрд░ рд╕реНрд╡рд╛рдж рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╕рдореВрд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд╛рдВрдЧреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдВрд╕реНрдЯрди@3 рдПрдХ рдирдИ рд░рд╛рдп рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ: рдЬрдЯрд┐рд▓ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдЕрд▓рдЧ, рдПрдХрд▓ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдзрдХреЗрд▓реЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдпреЛрдЬрди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдПрдВред

рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╡реНрдпрд╛рдЦреНрдпрд╛рдУрдВ рдФрд░ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред

рд╕рднреА рдиреЗ рдХрд╣рд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд░рд╛рдп рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ: рдХреНрдпрд╛ рдЗрд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@DABH рдЖрдкрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХреНрдпреЛрдВ рдмрдВрдж рдХрд┐рдпрд╛? @ рдЬреЗрд░реЗрдореА-рдЬреЗ-рдПрдХрд╕реЛ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ format.json() рдлреЙрд░реНрдореЗрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдИ рдЙрдкрд╛рдп рднреА рдирд╣реАрдВ рд╣реИред

const winston = require('winston');
const { format } = winston;

const logger = winston.createLogger({
  format: format.combine(
    format.errors({ stack: true }),
    format.metadata()
  ),
  transports: [ new winston.transports.Console() ],
});


function a() {
  throw new Error('Error from "a"');
  console.log('a()');
}

function b() {
  a();

  console.log('a() called from b()');
}

function c() {
  b();

  console.log('b() called from c()');
}

function f() {
  try {
    c();

    console.log('c() called from d()');
  } catch(error) {
    logger.error(error);
  }
}

f();
$ node 1.js
Error from "a"

[email protected] рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╣рд╛рдБ, рдореИрдВ @nosuchip рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ - рдпрджрд┐ рдЖрдк simple() рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдХрд╕реНрдЯрдо рдлреЙрд░реНрдореЗрдЯрд░ рдмрдирд╛рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рд╣реИрдХ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИред рд╕рд░рд▓ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХреЛрдб рдореБрдЭреЗ рдЙрд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЗрд╕рди рдореЗрдВ рдПрдХ рдвреЗрд░ рдФрд░ рдХрдЪреНрдЪреЗ рдкрд╛рда рдореЗрдВ рдПрдХ рдвреЗрд░ рджреЗрддрд╛ рд╣реИ:

const displayStack = winston.format((info) => {
  info.message = info.stack ? info.stack : info.message
  return info
})

const consoleDebugFormat = winston.format.combine(
  displayStack(),
  winston.format.simple()
)

const jsonFormat = winston.format.combine(
  winston.format.errors({ stack: true }),
  winston.format.json()
)

const activeFormat = process.env.LOG_FORMAT === 'simple' ? consoleDebugFormat : jsonFormat

const loggerConsole = new winston.transports.Console()
const logger = winston.createLogger({
  transports: [loggerConsole],
  format: activeFormat,
  exitOnError: false
})

рддреЛ рдХреНрдпрд╛ _рд╕реНрдЯрд┐рд▓_ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

... 
// standard transports and format initialization

export interface BetterLogger extends winston.Logger {
    exception: (error: Error, prefix?: string) => BetterLogger;
}

const logger: BetterLogger = winston.createLogger({
    level: config.logLevel,
    transports,
}) as BetterLogger;

// Monkey patching Winston because it incorrectly logs `Error` instances even in 2020
// Related issue: https://github.com/winstonjs/winston/issues/1498
logger.exception = function (error, prefix?) {
    const message = error.message || error.toString();
    const stack = error.stack;
    prefix = prefix ? `${prefix} ` : '';

    return this.error(`${prefix}${message}, stack ${stack}`) as BetterLogger;
};

export default logger;

рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░рдг: рд╡рд░реНрддрдорд╛рди рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣рдореЗрд╢рд╛ рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ info рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ instanceof Error ред

рдореИрдВ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛:

import winston from 'winston';
const consoleTransport = new winston.transports.Console({
    format: winston.format.combine(
        winston.format.errors({ stack: true }),
        winston.format.metadata(),
        winston.format.json(),
    )
});
export const logger = winston.createLogger({
    transports: [
        consoleTransport,
    ]
});

рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рджреБрдЦрдж рдмрд┐рдЯ рдХреЛ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ:
{"level":"error","metadata":{}}

рдмрд╕ рд╕рд░рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ:
error: undefined

рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдореБрдЭреЗ:

TypeError: Cannot read property 'check' of undefined
    at Object.updateSession (U:\Users\muj\endpoint\src\services\cookieService.ts:88:23)

рдХреНрдпрд╛ рд╡рд┐рдВрд╕реНрдЯрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдиреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдЕрдирдЪрд╛рд╣реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ?

рдХреЛрдИ рд╕реБрдзрд╛рд░?

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╣реИ Object.assign({}, info) рд╕реНрдЯреИрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ:

https://github.com/shrinktofit/editor-3d/blob/5afb36943c4f4fd9a145d82cd4bd44cd6b188242/app/node_modules/winston-transport/index.js#L91

рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ, рдЕрдЧрд░ рдореБрдЭреЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рдпрд╛ рддреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

  1. рдЬреЗрд╕рди рдФрд░ рдореЗрдЯрд╛ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрд░рд░ рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЬреЗрд╕рди рдлреЙрд░реНрдореЗрдЯрд░ рд▓реЙрдЧ рд╡рд╛рдкрд╕ рдкрд╛рдПрдВ
  2. рдпрд╛ рдореБрдЭреЗ рд╕рд░рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЙрдЧ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд╕реНрдЯрдо рдлреЙрд░реНрдореЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
    рдореИрдВ рд╕рд╣реА рд╣реВрдБ рдпрд╛ рдореИрдВ рдХреБрдЫ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдБ ??

рдпрд╣ 2021 рд╣реИ рдФрд░ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдКрдкрд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВрдиреЗ рд╡рд┐рдВрд╕реНрдЯрди рдХреЛ 2 рд╕реЗ 3 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ 2 рд╕реЗ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХреГрдкрдпрд╛ @DABH рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдпрд╣ рд╣рдорд╛рд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реИ, рд╣рдо рд╡рд┐рдВрд╕реНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рддреЛ .error рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╣рдорд╛рд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реИ, рд╣рдо рд╡рд┐рдВрд╕реНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рддреЛ .error рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

рд╣реЗ рд▓реЛрдЧреЛрдВ!
рдореИрдВрдиреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП errors рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
https://github.com/winstonjs/logform/pull/118

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

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

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

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

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

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

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