Winston: ¿Cómo personalizar el formato de la marca de tiempo?

Creado en 10 nov. 2017  ·  18Comentarios  ·  Fuente: winstonjs/winston

Estoy usando 3.0.0-rc1 y los documentos no son claros sobre cómo personalizar el formato de la marca de tiempo. Por favor ayuda.

Gracias,
Álvaro

Comentario más útil

Esto es extremadamente complicado para el requisito más simple de imprimir una marca de tiempo (que debería ser la predeterminada de todos modos):/

Todos 18 comentarios

puede leer el código fuente para ayudarse a personalizar el formato. Te puedo dar un ejemplo de la mía.

const winston = require('winston');
const moment = require('moment');
const util = require('util');
const MESSAGE = Symbol.for('message');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(
        winston.format(function(info, opts) {
            prefix = util.format('[%s] [%s]', moment().format('YYYY-MM-DD hh:mm:ss').trim(), info.level.toUpperCase());
            if (info.splat) {
                info.message = util.format('%s %s', prefix, util.format(info.message, ...info.splat));
            } else {
                info.message = util.format('%s %s', prefix, info.message);
            }
            return info;
        })(),
        winston.format(function(info) {
            info[MESSAGE] = info.message + ' ' + JSON.stringify(
                Object.assign({}, info, {
                    level: undefined,
                    message: undefined,
                    splat: undefined
                })
            );
            return info;
        })()
    ),
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: './logs/bitcoin.log' })
    ]
});

Esto es extremadamente complicado para el requisito más simple de imprimir una marca de tiempo (que debería ser la predeterminada de todos modos):/

Esto es lo que hago...

//registrador.js

const winston = require('winston');
const moment = require('moment');

// create formatter for dates used as timestamps
//const tsFormat = () => (new Date()).toLocaleTimeString();
const tsFormat = () => moment().format('YYYY-MM-DD hh:mm:ss').trim();

// define a logger with 2 transports - console and a file
const logger = new (winston.Logger)({
  transports: [
    // colorize the output to the console
    new (winston.transports.Console)({
        timestamp: tsFormat,
        colorize: true
    }),
    new winston.transports.File({
        filename: './logs/ttracker.log',
        timestamp: tsFormat,            // makes timestamp 'pretty'
        json: false                 // makes log format just like console output
    })
  ]
});

// set logging level one of { error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5 }
logger.level = 'debug';

module.exports = logger;

PD: solo configuro la marca de tiempo: en una función porque no me gusta el formato predeterminado que obtiene al configurar la marca de tiempo: verdadero, es decir, 2017-12-05T08: 22: 09.179Z

@jimwhurr : para mí, su código (nodo v6.11.0) produce:

Error: winston.Logger was moved in [email protected].
Use a winston.createLogger instead.
    at new <anonymous> (/Users/adrian/Documents/winston_test/node_modules/winston/lib/winston/common.js:162:15)
    at Object.<anonymous> (/Users/adrian/Documents/winston_test/index.js:7:16)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:389:7)
    at startup (bootstrap_node.js:149:9)

Tomando los ejemplos aquí, creé un ejemplo independiente más simple:

https://gist.github.com/ah/d02bd4ff238e5923fcf5369233e51401

const winston = require('winston');
const MESSAGE = Symbol.for('message');

const jsonFormatter = (logEntry) => {
  const base = { timestamp: new Date() };
  const json = Object.assign(base, logEntry)
  logEntry[MESSAGE] = JSON.stringify(json);
  return logEntry;
}

const logger = winston.createLogger({
  level: 'info',
  format: winston.format(jsonFormatter)(),
  transports: new winston.transports.Console(),
});

logger.info('message content', { "context": "index.js", "metric": 1 })
logger.info('message content 2')

Producción:

{"timestamp":"2017-12-07T16:07:10.518Z","context":"index.js","metric":1,"level":"info","message":"message content"}
{"timestamp":"2017-12-07T16:07:10.520Z","message":"message content 2","level":"info"}

Hola, aquí hay otra opción para iniciar sesión con marca de tiempo (probado en 3.0.0-rc0):

const winston = require('winston');
var customFormat = winston.format.combine(
winston.formato(
función contenido dinámico (información, opciones) {
info.nivel = 'info';
if(info.tiempo) {
var dt = nueva Fecha(),
fecha_ahora = dt.getDate() < 10 ? '0'+ dt.getDate() : dt.getDate(),
mes_ahora = (dt.getMonth() + 1) < 10 ? '0'+ (dt.getMonth() + 1) : (dt.getMonth() + 1),
año_ahora = dt.getFullYear(),
hrs_ahora = dt.getHours(),
mins_now = dt.getMinutes(),
segundos_ahora = dt.getSeconds(),
milisegundos_ahora = dt.getMillisegundos();
info.time = ' '+date_now+'-'+month_now+'-'+year_now+' '+hrs_now+':'+mins_now+':'+secs_now+':'+millisec_now+' ';
}
devolver información;
}
)(),
winston.format.simple() //formato de salida, también posible uso: .json() (en lugar de .simple)
);

const registrador = winston.createLogger({
nivel: 'información',
formato: formato personalizado,
transportes: [
nuevo winston.transports.File({ nombre de archivo: 'logs.log' })
]
});
módulo.exportaciones = registrador;`

Y para registro:

logger.log({ time: true, level: 'info', message: 'message for logging' });

Puede ser que sea útil.

puede personalizar la marca de tiempo con una cadena de formato:

winston.createLogger({
    level: ...
    format: winston.format.combine(
        winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.simple()
    ),
    transports: ...
});
winston.createLogger({
    level: ...
    format: winston.format.combine(
        winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.simple()
    ),
    transports: ...
});

Esto debería estar en los documentos. @felipemullen ¡Gracias!

@felipemullen gracias por proporcionar esa muestra. De acuerdo con @ricardoaat , esto debería estar en los documentos, así que... ahora está: ejemplos/custom-timestamp.js

@youngkylejan oh oh... Esa es una buena ayuda...
Pero tengo un problema... ¿qué hay {} al final del registro?

[2018-05-14 04:39:52] [INFO] API ejecutándose en localhost:3000 {}

Soy nuevo en Winston y, debo decir, los documentos son sorprendentemente difíciles de seguir :(

De alguna manera, terminé con la siguiente solución aparentemente más simple:

winston.createLogger({
    level: ...
    format: winston.format.printf(info => `${new Date().toISOString()} ${info.message}`),
    transports: ...
});

@hosseinganjyar
Cambio
info[MESSAGE] = info.message + ' ' + JSON.stringify(...);
para sólo
info[MESSAGE] = info.message;

Esto funcionó para mí.

Configuración:

  • Registros JSON
  • Marcas de tiempo
  • Rotación de registros
  • Registro de archivos y consolas
import winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import fs from 'fs';
import path from 'path';

const LOG_DIR = path.normalize(`${process.cwd()}/logs`);

if (!fs.existsSync(LOG_DIR)) {
  fs.mkdirSync(LOG_DIR);
}

const logger = winston.createLogger({
  exitOnError: false,
  silent: process.env.SUPPRESS_LOGS,
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.combine(
    winston.format.timestamp({
      format: 'YYYY-MM-DD HH:mm:ss',
    }),
    winston.format.json(),
  ),
  transports: [
    new winston.transports.Console(),
    new DailyRotateFile({
      dirname: LOG_DIR,
      filename: '%DATE%.log',
      datePattern: 'YYYY-MM-DD-HH',
      zippedArchive: false,
      maxSize: '1m',
      maxFiles: '14d',
    }),
  ],
});

export default logger;

Esto es todo para winston 3.0.0 y @types/winston 2.3.9

const consoleFormat = winston.format.printf(info => {
    const d = new Date();
    const timestamp = d.toLocaleTimeString();
    return `${timestamp} ${info.level}: ${info.message}`;

esto devuelve una marca de tiempo que es solo la hora en la zona horaria actual.
para el formato de archivo que uso

const timestamp = `${d.toISOString()} (${d.toLocalTimeString()})`;

entonces

const logger = winston.createLogger({
    level: "debug",
    format: fileFormat,
    transports: [ new winston.transports.File({ filename: "yourname.log", level: "debug"}) ]
});

probablemente no necesita nivel dos veces. pero eso es lo que estoy usando actualmente.

puede personalizar la marca de tiempo con una cadena de formato:

winston.createLogger({
    level: ...
    format: winston.format.combine(
        winston.format.label({ label: '[my-label]' }),
        winston.format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        winston.format.simple()
    ),
    transports: ...
});

salvavidas ¡¡¡Muchas gracias!!!

Para aquellos que están aquí para averiguar cómo personalizar la cadena de formato además YYYY-MM-DD HH:mm:ss : winston usa fecha debajo del capó , por lo que puede consultar la documentación de fecha.

Todos esos ejemplos eliminan los parámetros de descanso en los registros. Si desea usar format.simple() y solo agregar la marca de tiempo al principio y eliminar del resto, esto podría funcionar para usted:

const simpleFormat = format.simple()
const MESSAGE = Symbol.for('message')
const simpleTimestamp = format(info => {
  const { timestamp, ...rest } = info
  const simpled = simpleFormat.transform(rest)
  if (typeof simpled !== 'boolean') {
    // @ts-ignore
    simpled[MESSAGE] = `${timestamp} ${simpled[MESSAGE]}`
  }
  return simpled
})

logger.add(new transports.Console({
  format: format.combine(
      format.timestamp(),
      format.colorize(),
      simpleTimestamp(),
  ),
}))
¿Fue útil esta página
0 / 5 - 0 calificaciones