Winston: Dans 3.0.0, je ne peux pas enregistrer d'objets sans utiliser JSON.stringify

Créé le 22 févr. 2018  ·  18Commentaires  ·  Source: winstonjs/winston

Je suis sur la version 3, mais depuis que j'ai mis à jour la seule façon de consigner les objets est de stringifier d'abord l'objet.
Mais avec des erreurs, c'est encore pire car je ne peux pas du tout enregistrer l'erreur, je dois utiliser error.message ou directement la console.

Voici ma configuration pour l'environnement de développement :

`` const { createLogger, format, transports } = require('winston');
const { combiner, horodatage, étiquette, printf } = format ;

const environment = process.env.NODE_ENV;
const timestampFormat = 'YYYY-MM-DD HH:mm:SS';

const loggerFormat = printf((info) => {
    return `[${info.label}] ${info.message}`;
});
logger = createLogger({
    format: combine(
        label({ label: 'immoliste' }),
        format.colorize({ all: true }),
        format.splat(),
        format.simple(),
        loggerFormat
    ),
    transports: [
        new transports.Console({
            level: 'debug',
            colorized: true
        })
    ]
});

Ce faisant:

logger.error('Error sending contact message:', JSON.stringify(err));

je n'ai eu que :

[mylabel] Error sending contact message:

Mais c'est une douleur dans le cul d'avoir à tout stringifier, et de le faire pour les erreurs. Qu'est-ce que je fais de mal ?, car dans les versions précédentes, c'était simple.

Commentaire le plus utile

Sérieusement, cela ressemble à un déclassement. Avec Winston 2, je pouvais simplement remplacer tous les console.X par winston.X . Pourquoi du coup les balises de format moches ?

Tous les 18 commentaires

+1

@eyp pouvez-vous essayer ceci?

logger.error('Error sending contact message:%o', {foo: "bar"});

La source sous-jacente est ici :

https://github.com/winstonjs/logform/blob/master/splat.js

que vous pouvez voir utiliser util.format du nœud

https://nodejs.org/api/util.html#util_util_format_format_args

donc %o , %O et %j font le travail

%o

fonctionne comme un charme, je ne savais pas que Winston utilisait les mêmes paramètres de formatage que util.format.

Merci!

Winston 3.1.0
J'essaie ceci en écrivant ici:
const debugConsole = new winston.transports.Console({
niveau : 'débogage',
format : winston.format.combine(winston.format.simple()),
handleExceptions : vrai
})
logger.add(debugConsole)

Dans le code j'utilise : logger.debug('%o', req.query)
Je vois un objet json, mais je vois aussi "%o" avant, journal de la console ci-dessous :
débogage : %o {"offset":"73000","count":"3","timestamp":"2018-10-29 15:02:08"}
qu'est-ce que je fais ?

Généralement %o est appelé par util.format() où vous spécifiez l'objet que vous voulez. D'après la sortie, il semble que vous n'ayez même pas besoin de %o car l'objet est affiché.

Utilisez simplement ceci à la place, logger.debug(req.query) et cela devrait fonctionner. Ou vous pouvez le stocker dans une variable avec util.format comme ceci
const queryFormatted = util.format('%o', req.query)
logger.debug(queryFormatted)

@frenzymind Ou essayez le travail qui a été posté sur le numéro original par @mingchuno.

Utilisez simplement ceci à la place, logger.debug(req.query) et cela devrait fonctionner

@eponymz Dans ce cas il y a : debug: [object Object] {"timestamp":"2018-10-30 11:14:04"}

const queryFormatted = util.format('%o', req.query)

C'est fonctionnel, mais bruyant.

La sortie de la seconde est-elle ce que vous vouliez? Je veux dire par là, si vous vouliez la requête dans les journaux, est-ce qu'elle s'affiche. Sinon, essayez la solution de contournement mentionnée avant la publication de mingchuno.

Oui, la deuxième façon fonctionne comme je le souhaite. Je vois des données d'objet json.
Si je comprends bien, mingchuno a conseillé d'utiliser %o dans la chaîne, car winston utilise l'util "sous le capot". J'essaie et ça marche, mais %o est aussi imprimé dans mon cas. J'ajoute également le format splat() à mon niveau de débogage, mais rien ne change. Est-ce que je manque quelque chose?

Oui, je vois %o pré-suspendu à l'inspection de l'objet. Je suppose que c'est une sorte de bug ?

Est-ce un choix de conception délibéré ? Il s'écarte un peu de la norme (et m'a pris une bonne heure pour trouver) au lieu de

console.log('Log me plz: ', {'ok': 'logged'});

devoir (winston 3.x) changer tous les appels de journalisation en

logger.info('Log me plz: %o', {'ok':'logged'});

Désolé, ai-je raison ? Je suis confus...

Sérieusement, cela ressemble à un déclassement. Avec Winston 2, je pouvais simplement remplacer tous les console.X par winston.X . Pourquoi du coup les balises de format moches ?

Donc, le correctif consiste à ajouter le %o à chaque instruction de journalisation pour laquelle je souhaite imprimer un objet ?

Oui!

Je ne pouvais pas accepter que je doive toujours utiliser %o et j'ai fait cette solution simple :

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

Alors ce bûcheron....

  logger.info({ hi: 123 })

... se transforme en cela dans la console

info: {
    "hi": 123
}

J'espère que je peux vous aider les gars :D C'est juste horrible si nous avions toujours deux utilisations "%o"

Je ne pouvais pas accepter que je doive toujours utiliser %o et j'ai fait cette solution simple :

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})

Alors ce bûcheron....

  logger.info({ hi: 123 })

... se transforme en cela dans la console

info: {
    "hi": 123
}

J'espère que je peux vous aider les gars :D C'est juste horrible si nous avions toujours deux utilisations "%o"

Joli, mais c'est bizarre, dois-je le faire pour tout mon niveau d'enregistreur ?

Juste pour information, il vaut mieux utiliser
```javascript
type d'info.message === 'objet'
````
à la place de

```javascript
info.message.constructor === Objet
````
Il évite les erreurs lorsque le message est nul ou indéfini et les tableaux seront affichés correctement
(ex : [{salut : "456"}]

Cette page vous a été utile?
0 / 5 - 0 notes