Winston: 3.0.0-rc1 - рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд▓реЙрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рджрд┐рд╕ре░ 2017  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: winstonjs/winston

рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рдФрд░ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд▓реЙрдЧрд░ рдмрдирд╛рдпрд╛:

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 рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдзреНрд╡рдЬ рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ?

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

@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

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

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрднреА рддрдХ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ? рдореИрдВ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рд╡рд┐рдВрд╕реНрдЯрди@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() ),

рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП

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

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

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

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

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

sinai-doron picture sinai-doron  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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