Winston: 3.0.0-rc1: no se pueden registrar las marcas de tiempo

Creado en 28 dic. 2017  ·  13Comentarios  ·  Fuente: winstonjs/winston

Seguí el ejemplo de la documentación y creé un registrador como se muestra a continuación:

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');

Pero, parece que puedo hacer que las marcas de tiempo funcionen. Obtengo el siguiente resultado en blanco y negro:

{"mensaje":"Servidor iniciado","nivel":"info"}

Según la documentación en https://github.com/winstonjs/winston/blob/master/docs/transports.md#console -transport, establecer el indicador de marca de tiempo en verdadero debería poner una marca de tiempo predeterminada.

Incluso intenté devolver una marca de tiempo personalizada pasando una función, pero incluso eso no aparece. Tal vez, me perdí algo, pero parece que ninguna de las opciones funciona, es decir. colorear, mostrar nivel, marca de tiempo.

¿O la documentación no está sincronizada?

Comentario más útil

@armadillojim

Usa el formato printf así:

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

Todos 13 comentarios

¿Aún no hay actualizaciones sobre este tema? Estoy enfrentando el mismo problema. Funciona en [email protected] pero no en [email protected]

Echa un vistazo a los formatos que puedes usar con [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')

El ejemplo imprime lo siguiente:

{"mensaje":"Servidor iniciado","nivel":"info","marca de tiempo":"2018-01-17T15:20:55.621Z"}

O con la opción de formato:

{"mensaje":"Servidor iniciado","nivel":"info","marca de tiempo":"2018-01-17"}

¿Por qué format.timestamp no funciona sin que se declare format.json después format.timestamp ?

Solo quiero un simple al comienzo de la línea tal como estaba antes, no quiero el formato json
[2018-01-17T15:20:55.621Z] INFORMACIÓN sdfsdfsdfsdfdfasfsadf, ¿cómo puedo lograr esto?

En la versión 2.3.1 puedo lograr:
2018-02-12T18:50:25.472Z - INFO: Starting up the process

Con:

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

Tenía la esperanza de utilizar el registro de línea de texto "simple". Intenté seguir los documentos:

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()]
});

Pero eso termina mezclando texto y JSON como:

info: GET /alice?bob {"timestamp":"2018-02-21T02:52:31.452Z"}

Tenía la esperanza de prefijar cada línea con la marca de tiempo y que la marca de tiempo se imprimiera sola. Algo como:

2018-02-21T02:52:31.452Z info: GET /alice?bob

pero los comentarios anteriores indican que eso solo es posible usando el estilo antiguo de pasar opciones al constructor Console() .

¿Alguna sugerencia? ¿O estoy haciendo la pregunta equivocada? Es decir, ¿los analizadores de registros prefieren JSON en estos días? TIA.

@armadillojim

Usa el formato printf así:

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 eres el hombre, también si quieres mostrar el símbolo, mejoré tu respuesta con:
`
const vsprintf = require('sprintf-js').vsprintf;

const miFormato = printf(información => ${info.timestamp} ${info.level}: ${vsprintf(info.message, ...(info.splat || []))} )
`

@ChrisAlderson , ¡muchas gracias! La documentación no me pareció clara al respecto. ¡Muy apreciado!

Gracias por ayudar a la gente @ChrisAlderson. Las contribuciones sobre la documentación para mejorar la explicación de cómo funcionan los formatos serían muy bienvenidas 👍

Nota: tenga cuidado al usar la marca de tiempo con metadatos, aparentemente usar ambas funciones de formato lleva a poner la marca de tiempo como info.metadata.timestamp en lugar de info.timestamp

En caso de que alguien necesite registrar metadatos adicionales, incluida la pila de errores, el fragmento a continuación hace el trabajo (PD: el ejemplo usa un formato de salida simple). El recorte a continuación tiene como objetivo el resultado esperado de @armadillojim (descrito anteriormente) y es una pequeña mejora basada en la respuesta de @ChrisAlderson .

Como lo describe @OzzyTheGiant , cuando se usa la marca de tiempo con metadatos, se accede a timestamp como una propiedad de metadata , no 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'));

Producción:

// 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 ...

¿Por qué format.timestamp no funciona sin que se declare format.json después format.timestamp ?

Esto sigue siendo la cosa 2 años después.

esto funciona
format: winston.format.combine( winston.format.timestamp(), winston.format.json() ),

esto no
format: winston.format.combine( winston.format.json(), winston.format.timestamp() ),

para escribir registros en un archivo

¿Fue útil esta página
0 / 5 - 0 calificaciones