web-dev-qa-db-fra.com

Winston n'imprime pas sur la console

J'essaie de faire en sorte que Winston soit assez imprimé sur la console, donc je l'ai collé dans un fichier et l'ai exécuté avec node:

var winston = require('winston');
winston.cli();
winston.data({
  a: "test",
  of: "many",
  properties: {
    like: "this"
  }
});
winston.data('data', {
  a: "test",
  of: "many",
  properties: {
    like: "this"
  }
});

Le terminal a recraché les messages suivants (pas exactement jolis):

data:     a=test, of=many, like=this
data:    data a=test, of=many, like=this

Je suis les instructions sur le Winston Readme ("Utilisation de winston dans un outil CLI"). Suis-je en train de mal lire quelque chose? Vous manquez un paramètre quelque part?

29
JoBu1324

J'ai trouvé la réponse (la documentation est incorrecte). Si vous utilisez le constructeur et ajoutez manuellement des transports, vous pouvez définir des options, à la fois pour Winston et pour les transports individuels. Certaines options doivent être ajoutées directement à Winston, tandis que d'autres doivent être ajoutées au transport.

Par exemple.:

var winston = require('winston');
var logger = new (winston.Logger)({
  levels: {
    trace: 0,
    input: 1,
    verbose: 2,
    Prompt: 3,
    debug: 4,
    info: 5,
    data: 6,
    help: 7,
    warn: 8,
    error: 9
  },
  colors: {
    trace: 'Magenta',
    input: 'grey',
    verbose: 'cyan',
    Prompt: 'grey',
    debug: 'blue',
    info: 'green',
    data: 'grey',
    help: 'cyan',
    warn: 'yellow',
    error: 'red'
  }
});

logger.add(winston.transports.Console, {
  level: 'trace',
  prettyPrint: true,
  colorize: true,
  silent: false,
  timestamp: false
});

logger.add(winston.transports.File, {
  prettyPrint: false,
  level: 'info',
  silent: false,
  colorize: true,
  timestamp: true,
  filename: './nKindler.log',
  maxsize: 40000,
  maxFiles: 10,
  json: false
});
30
JoBu1324

Si vous utilisez [email protected], la réponse acceptée ne fonctionnera pas. Essayez ce qui suit:

const winston = require("winston");
let date = new Date().toISOString();
const logFormat = winston.format.printf(function(info) {
  return `${date}-${info.level}: ${JSON.stringify(info.message, null, 4)}\n`;
});
const logger = winston.createLogger({
  transports: [
    new winston.transports.Console({
      level: level,
      format: winston.format.combine(winston.format.colorize(), logFormat)
    })
  ]
});

Les journaux auront le format suivant:

C'est coloré BTW

2018-03-01T19:49:54.042Z-info: "----- Customer Details ------"

2018-03-01T19:49:54.042Z-info: [
    {
        "A": 1,
        "B": 2
    }
]
13
Sam Gh

Voici une solution pour Winston v3 +

  let winstonFormat = winston.format.json();
  if (NODE_ENV == "development") {
    winstonFormat = winston.format.combine(winston.format.json(), winston.format.prettyPrint());
  }

  const log = winston.createLogger({
    level: "info",
    format: winstonFormat,
    defaultMeta: {app: "myapp"},
    transports: [
      new winston.transports.File({filename: "/dev/stderr", level: "warn"}),
      new winston.transports.File({filename: "/dev/stdout"}),
    ],
  });
4
chrishiestand

J'ai pris la réponse de @ partycoder et je l'ai réduite pour n'utiliser que les niveaux de journalisation par défaut fournis avec winston. Il n'inverse pas non plus l'ordre des erreurs. 0 = priorité la plus élevée.

winston.addColors({
  silly: 'Magenta',
  debug: 'blue',
  verbose: 'cyan',
  info: 'green',
  warn: 'yellow',
  error: 'red'
});

winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {
  level: process.env.LOG_LEVEL,
  prettyPrint: true,
  colorize: true,
  silent: false,
  timestamp: false
});
2
timetofly

J'ai également rencontré le même problème, mais je suis venu le rencontrer sur git et j'ai trouvé une astuce intéressante qui pourrait être utile à ce sujet. problème # 1217

Tout d'abord, l'astuce consiste à utiliser

JSON.stringify(jsonData, null, 4) // This helps indent lines and make them readable

Vous pouvez le voir dans cette capture d'écran du code Visual Studio ci-dessous pour une documentation claire comment utiliser JSON.stringify

Par exemple, si vous utilisiez un transporteur de console, vous le créeriez comme ceci

    transports: [
        new winston.transports.Console({
            format: printf((info) => {
                return `${info.timestamp} [${info.label}] [${info.level}] : ${info.message}\n 
            ${JSON.stringify(info.meta, null, 4)}`; // Meta as additional data you provide while logging
                ;
            })
        })
    ]

Et utilisez-le comme

Logger.info("Message text", { meta: metaDataHere } )
0
Nehemie Niyomahoro