winston
рд╕рдВрд╕реНрдХрд░рдг?_ 3.1.0winston@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);
}
рдХрдо рд╕реЗ рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ - рдвреЗрд░ рдХреЗ рд╕рд╛рдеред
рдпрд╣ 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;
});
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕реБрд╕рдВрдЧрдд рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЙрдЧрд░ рдХреА рддреНрд░реБрдЯрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрдЬрд╛рдп рдХрд╕реНрдЯрдо рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рдЯреВ-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЕрд╕рдВрдЧрдд) рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд/рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рд╕реБрдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╣реИрдХреА) )
рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдВрд╕реНрдЯрди рдкреНрд░рд╛рд░реВрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдлреЙрд░реНрдореЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг?
рддреЛ, рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдерд╛ред рдпрд╣ рдЕрднреА рд╡рд┐рдВрд╕реНрдЯрди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ [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)
рд╕реНрдЯреИрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ:
рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ, рдЕрдЧрд░ рдореБрдЭреЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рдпрд╛ рддреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рдпрд╣ 2021 рд╣реИ рдФрд░ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдпрд╣ рдПрдХ рдКрдкрд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВрдиреЗ рд╡рд┐рдВрд╕реНрдЯрди рдХреЛ 2 рд╕реЗ 3 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ 2 рд╕реЗ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХреГрдкрдпрд╛ @DABH рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рдпрд╣ рд╣рдорд╛рд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реИ, рд╣рдо рд╡рд┐рдВрд╕реНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рддреЛ .error
рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╣рдорд╛рд░реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реИ, рд╣рдо рд╡рд┐рдВрд╕реНрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рддреЛ
.error
рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ
рд╣реЗ рд▓реЛрдЧреЛрдВ!
рдореИрдВрдиреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП errors
рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
https://github.com/winstonjs/logform/pull/118
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рддреЛ, рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдерд╛ред рдпрд╣ рдЕрднреА рд╡рд┐рдВрд╕реНрдЯрди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ [email protected] рдореЗрдВ рд╣реИ , рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ
metadata
рдФрд░json
рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редрддреЛ, рд╣рд╛рдБ, рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБред рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред