рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рдФрд░ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд▓реЙрдЧрд░ рдмрдирд╛рдпрд╛:
const { createLogger, format, transports } = require('winston');
const logger = createLogger(
{
level: 'info',
transports: [new transports.Console({
showLevel: false,
colorize: true,
timestamp: true
})
]
}
);
logger.info('Server started');
рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдо рд╕реНрдЯреИрдореНрдк рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдмреНрд▓реИрдХ рдПрдВрдб рд╡реНрд╣рд╛рдЗрдЯ рдореЗрдВ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ:
{"message": "рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реБрдЖ", "рд╕реНрддрд░": "рдЬрд╛рдирдХрд╛рд░реА"}
https://github.com/winstonjs/winston/blob/master/docs/transports.md#console -transport рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдзреНрд╡рдЬ рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рдХреЗ рдПрдХ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рд╡рд╣ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред рд╢рд╛рдпрдж, рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреАред рдХрд▓рд░рд╛рдЗрдЬрд╝, рд╢реЛрд▓реЗрд╡рд▓, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкред
рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ?
рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрднреА рддрдХ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ? рдореИрдВ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рд╡рд┐рдВрд╕реНрдЯрди@2.4.0 рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рдВрд╕реНрдЯрди@3.0.0-рдЖрд░рд╕реА1 рдкрд░ рдирд╣реАрдВ
рдЙрди рд╕реНрд╡рд░реВрдкреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк [email protected]
рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
const { createLogger, format, transports } = require('winston')
const logger = createLogger({
level: 'info',
transports: new transports.Console({
format: format.combine(
format.timestamp({
format: 'YYYY-MM-DD' // Optional for choosing your own timestamp format.
}),
format.json()
)
})
})
logger.info('Server started')
рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
{"message":"рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реБрдЖ",,"рд╕реНрддрд░":"рдЬрд╛рдирдХрд╛рд░реА",,"рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк":"2018-01-17T15:20:55.621Z"}
рдпрд╛ рд╕реНрд╡рд░реВрдкрдг рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде:
{"message": "рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реБрдЖ", "рд╕реНрддрд░": "рдЬрд╛рдирдХрд╛рд░реА", "рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк": "2018-01-17"}
рдХреНрдпреЛрдВ format.timestamp
format.json
рдХреЗ рдмрд╛рдж рдШреЛрд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ format.timestamp
?
рдореИрдВ рдмрд╕ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдерд╛, рдореБрдЭреЗ рдЬреЗрд╕рди рд╕реНрд╡рд░реВрдкрдг рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП
[2018-01-17T15:20:55.621Z] рдЬрд╛рдирдХрд╛рд░реА sdfsdfsdfsdfdfasfsadf, рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рд╕рдВрд╕реНрдХрд░рдг 2.3.1 рдкрд░ рдореИрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
2018-02-12T18:50:25.472Z - INFO: Starting up the process
рд╕рд╛рде:
const winston = require('winston');
const logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({ timestamp: true, colorize: true}),
],
exceptionHandlers: [
new (winston.transports.Console)({ timestamp: true, colorize: true }),
],
level: 'INFO',
levels: {
FATAL: 0,
ERROR: 1,
WARN: 2,
INFO: 3,
DEBUG: 4
},
colors: {
INFO: 'blue',
WARN: 'green',
ERROR: 'yellow',
FATAL: 'red'
}
});
module.exports = logger
рдореИрдВ "рд╕рд░рд▓" рд▓рд╛рдЗрди-рдСрдл-рдЯреЗрдХреНрд╕реНрдЯ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдбреЙрдХреНрд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.colorize(),
winston.format.simple()
),
transports: [new winston.transports.Console()]
});
рд▓реЗрдХрд┐рди рд╡рд╣ рдкрд╛рда рдФрд░ JSON рдЬреИрд╕реЗ рдорд┐рд╢реНрд░рдг рдХреЛ рд╣рд╡рд╛ рджреЗрддрд╛ рд╣реИ:
info: GET /alice?bob {"timestamp":"2018-02-21T02:52:31.452Z"}
рдореИрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдЕрдХреЗрд▓реЗ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
2018-02-21T02:52:31.452Z info: GET /alice?bob
рд▓реЗрдХрд┐рди рдКрдкрд░ рджреА рдЧрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ Console()
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реА рд╕рдВрднрд╡ рд╣реИред
рдХреЛрдИ рд╕реБрдЭрд╛рд╡? рдпрд╛ рдореИрдВ рдЧрд▓рдд рд╕рд╡рд╛рд▓ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдБ? рдпрд╣реА рд╣реИ, рдХреНрдпрд╛ рд▓реЙрдЧ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрди рджрд┐рдиреЛрдВ JSON рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ? рдЯреАрдЖрдИрдП.
@armadillojim
рдЗрд╕ рддрд░рд╣ printf
рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ:
const { createLogger, format, transports } = require('winston')
const { colorize, combine, timestamp, printf } = format
// Define your custom format with printf.
const myFormat = printf(info => {
return `${info.timestamp} ${info.level}: ${info.message}`
})
const logger = createLogger({
format: combine(
timestamp(),
colorize(),
myFormat
),
transports: [new transports.Console()]
})
logger.info('foo') // -> 2018-02-21T03:55:19.236Z info: foo
@ChrisAlderson рдЖрдк рдЖрджрдореА рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдк рд╕реНрдкреНрд▓реИрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЛ рдмрдврд╝рд╛рдпрд╛ рд╣реИ:
`
const vsprintf = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('sprintf-js').vsprintf;
const myFormat = рдкреНрд░рд┐рдВрдЯрдл (рдЬрд╛рдирдХрд╛рд░реА => ${info.timestamp} ${info.level}: ${vsprintf(info.message, ...(info.splat || []))}
)
`
@ рдХреНрд░рд┐рд╕ рдПрд▓реНрдбрд░рд╕рди , рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рджрд╕реНрддрд╛рд╡реЗрдЬ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА!
@ChrisAlderson рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░ рдпреЛрдЧрджрд╛рди рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдиреЛрдЯ: рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рджреЛрдиреЛрдВ рдкреНрд░рд╛рд░реВрдк рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЯрд╛рдЗрдо рд╕реНрдЯреИрдореНрдк рдХреЛ info.timestamp рдХреЗ рдмрдЬрд╛рдп info.metadata.timestamp рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдвреЗрд░ рд╕рд╣рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (PS: рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдирд┐рдк @armadillojim рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ (рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд) рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ @ChrisAlderson рдХреЗ рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕реБрдзрд╛рд░ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ @OzzyTheGiant рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, timestamp
рдХреЛ metadata
рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ info
ред
import winston from 'winston';
// Creates the default formatter.
// We deconstruct "metadata" into "timestamp" and "meta", and use them in the default formatter.
const logFormat = winston.format.printf((info) => {
const { timestamp, ...meta } = info.metadata;
return `${timestamp} ${info.level}: ${info.message} ${JSON.stringify(meta)}`;
});
// Creates the logger. "padLevels", "colorize" and "padLevels" are optional.
logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.padLevels(),
winston.format.metadata(),
winston.format.errors({ stack: true }),
logFormat,
winston.format.colorize({ all: true })
),
transports: [new winston.transports.Console()],
});
logger.info('Simple log');
logger.info('Logger Info', { logLevel: 'info', colorize: { all: true } });
logger.error('', new Error('Logger error'));
рдЖрдЙрдЯрдкреБрдЯ:
// 2019-05-11 00:20:53 info: Simple log {}
// 2019-05-11 00:20:53 info: Logger Info {"logLevel":"info","colorize":{"all":true}}
// 2019-05-11 00:20:53 error: Logger error {"stack":"Logger error\n at ...
рдХреНрдпреЛрдВ
format.timestamp
format.json
рдХреЗ рдмрд╛рдж рдШреЛрд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИformat.timestamp
?
2 рд╕рд╛рд▓ рдмрд╛рдж рднреА рдпрд╣реА рдмрд╛рдд рд╣реИред
рдпрд╣ рд╕рд╣реА рд╣реИ
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
рдпрд╣ рдирд╣реАрдВ рд╣реИ
format: winston.format.combine(
winston.format.json(),
winston.format.timestamp()
),
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@armadillojim
рдЗрд╕ рддрд░рд╣
printf
рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ: