Winston: рд╡рд┐рдВрд╕реНрдЯрди рдПрдХ рдЕрдкрд╡рд╛рдж рд╕реЗ рдкрдХрдбрд╝реА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЙрдЧ/рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдорд╛рд░реНрдЪ 2020  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: winstonjs/winston

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

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

    • [ ] winston@2

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

  • _ node -v рдЖрдЙрдЯрдкреБрдЯ:_ v12.8.1
  • _рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо?_ (рд╡рд┐рдВрдбреЛрдЬрд╝, рдореИрдХрдУрдПрд╕, рдпрд╛ рд▓рд┐рдирдХреНрд╕) рд╡рд┐рдВрдбреЛрдЬрд╝
  • _рднрд╛рд╖рд╛?_ (рд╕рднреА | рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ XX | ES6/7 | ES5 | рдбрд╛рд░реНрдЯ) ES6

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

рд╡рд┐рдВрд╕реНрдЯрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рдХреЛ рдареАрдХ рд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
    transports: [
        new winston.transports.File({
            filename: `./logs/error-${momentLogger.unix()}.log`,
            level: 'error'
        }),
        new winston.transports.File({
            filename: `./logs/debug-${momentLogger.unix()}.log`,
            level: 'debug'
        }),
        new winston.transports.File({
            filename: `./logs/combined-${momentLogger.unix()}.log`
        }),
        new winston.transports.Console({
            format: winston.format.simple()
        })
    ]
});

try {
    logger.debug(folderIdRegex.exec(event.link)[1]);
} catch (ex) {
    console.log(ex); // Correctly prints
    logger.info(ex); // Undefined
    logger.debug(ex); // Undefined
    logger.error(ex); // Undefined
}

VSCode рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЧреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ

// Output
TypeError: Cannot read property '1' of null
    at .....google-sheets-scraping-testing.js:188:51
    at processTicksAndRejections (internal/process/task_queues.js:85:5)
info: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}
error: undefined {"timestamp":"2020-03-04T19:58:36.251Z"}

// Here I started using the built-in debug terminal
ex // Input into debug console
> TypeError: Cannot read property '1' of null // Result of ex
logger.log(ex) // Input into debug console
info: undefined {"timestamp":"2020-03-04T20:11:13.924Z"} // Result of logger.log(ex)
> DerivedLogger {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 3, _maxListeners: undefined, тАж}  // Result of logger.log(ex)

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

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд┐рдВрд╕реНрдЯрди рдХреИрдЪреНрдб рдПрд░рд░ рдХреЛ try...catch рдмреНрд▓реЙрдХ рд╕реЗ рд▓реЙрдЧ рдХрд░реЗрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ ex рдмрдЬрд╛рдп ex.message рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдареАрдХ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред ex рдХреЛ рдкреВрд░реЗ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдВрд╕реНрдЯрди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдЕрдиреНрдп рд╕реВрдЪрдирд╛

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдореИрдВ рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд╕реЗ return ex рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рд╕рдм рдХреБрдЫ рджреВрд╕рд░реЗ рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдШреЗрд░ рд▓реЗрддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдЗрд╕ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдПрдХ рд╕рдорд░реНрдерди рдкреЛрд╕реНрдЯ рдХрд╛

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдкрд┐рдЫрд▓реЗ рдПрдХ рдорд╣реАрдиреЗ рд╕реЗ #1758 . рдкрд░ рд╣реИ

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдВрд╕реНрдЯрди рд▓реЙрдЧрд░реНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдВрд╕реНрдЯрди-рдкрд░рд┐рд╡рд╣рди рдореЗрдВ, TransportStream _write рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдХрд░рддрд╛ рд╣реИ:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

рд╡рд┐рдВрд╕реНрдЯрди/рд▓реЙрдЧрд░.рдЬреЗрдПрд╕ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдб рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

this.push(this.format.transform(info, this.format.options));

рдпрд╣рд╛рдБ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реЗрдкреЛ рд╣реИред

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдВрд╕реНрдЯрди рд▓реЙрдЧрд░реНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдВрд╕реНрдЯрди-рдкрд░рд┐рд╡рд╣рди рдореЗрдВ, TransportStream _write рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдХрд░рддрд╛ рд╣реИ:

transformed = this.format.transform(Object.assign({}, info), this.format.options);

рд╡рд┐рдВрд╕реНрдЯрди/рд▓реЙрдЧрд░.рдЬреЗрдПрд╕ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдб рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

this.push(this.format.transform(info, this.format.options));

рдпрд╣рд╛рдБ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реЗрдкреЛ рд╣реИред

const winston = require('winston');

// First logger uses a format configured on logger
const logger1 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console(),
  format: winston.format.simple()
});


// Second logger uses a format configured on transport
const logger2 = winston.createLogger({
  level: 'info',
  transports: new winston.transports.Console({
    format: winston.format.simple()
  })
});

logger1.info(new Error('err message'));   // logs expected 'err message'
logger2.info(new Error('err message'));   // logs 'undefined'

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рднреА рд╡рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рд╡рд┐рдВрд╕реНрдЯрди рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ [object Object] рд░реВрдк рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ

@jleverenz
рдзрдиреНрдпрд╡рд╛рдж, рдмрдврд╝рд┐рдпрд╛ рдЦреЛрдЬ! рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдирд┐рдХрд▓рд╛, рдЬреЛ https://github.com/winstonjs/winston/issues/1758 рдЬреИрд╕рд╛ рд╣реА рдерд╛ред

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