winston
рд╕рдВрд╕реНрдХрд░рдг?_ 3.2.1winston@2
winston@3
node -v
рдЖрдЙрдЯрдкреБрдЯ:_ v12.8.1рд╡рд┐рдВрд╕реНрдЯрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рдХреЛ рдареАрдХ рд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
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'
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рднреА рд╡рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рд╡рд┐рдВрд╕реНрдЯрди рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ [object Object]
рд░реВрдк рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ
@jleverenz
рдзрдиреНрдпрд╡рд╛рдж, рдмрдврд╝рд┐рдпрд╛ рдЦреЛрдЬ! рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдирд┐рдХрд▓рд╛, рдЬреЛ https://github.com/winstonjs/winston/issues/1758 рдЬреИрд╕рд╛ рд╣реА рдерд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдВрд╕реНрдЯрди рд▓реЙрдЧрд░реНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдВрд╕реНрдЯрди-рдкрд░рд┐рд╡рд╣рди рдореЗрдВ, TransportStream _write рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдХрд░рддрд╛ рд╣реИ:
transformed = this.format.transform(Object.assign({}, info), this.format.options);
рд╡рд┐рдВрд╕реНрдЯрди/рд▓реЙрдЧрд░.рдЬреЗрдПрд╕ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдб рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
this.push(this.format.transform(info, this.format.options));
рдпрд╣рд╛рдБ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реЗрдкреЛ рд╣реИред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред