2015-10-15 19 views
9

Stavo guardando migliori sistemi di registrazione Node: npmlog, log4js, bunyan e winston e ha deciso di utilizzare winston per avere le più npm download mensili.Come registrare oggetti e array JavaScript in winston come fa console.log?

Quello che voglio impostare è il logger personalizzato che sarò in grado di utilizzare in ambiente di sviluppo con logger.debug(...) che non registrerà nulla sull'ambiente di produzione. Questo mi aiuterà in questo modo quando sono in ambiente di sviluppo, non avrò bisogno di scrivere nulla visto che vedrò tutte le uscite.

Questo è quello che ho adesso:

var level = 'debug'; 
if (process.env.NODE_ENV !== 'development'){ 
    level = 'production'; // this will never be logged! 
} 

var logger = new winston.Logger({ 
    transports: [ 
    // some other loggings 
    new winston.transports.Console({ 
     name: 'debug-console', 
     level: level, 
     prettyPrint: true, 
     handleExceptions: true, 
     json: false, 
     colorize: true 
    }) 

    ], 
    exitOnError: false // don't crush no error 
}); 

problema si verifica quando sto cercando di accedere JavaScript Object o Javascript Array. Con Object, ho bisogno di fare toJSON(), e per Array ho bisogno di prima JSON.stringify() e poi JSON.parse().

Non è bello scrivere sempre questi metodi, solo per registrare qualcosa che voglio. Inoltre, non è nemmeno favorevole alle risorse, perché quei metodi di formattazione devono essere eseguiti prima che logger.debug() si accorga che è in produzione e che non dovrebbe registrarlo in primo luogo (in pratica, sta valutando gli argomenti prima della chiamata alla funzione). Mi piace il modo in cui il vecchio stile console.log() registra oggetti e array JavaScript.

Ora, mentre sto scrivendo questa domanda, ho scoperto che esiste un modo di descrivere custom format per ogni oggetto winston transports. È questo il modo di farlo, o c'è un altro modo?

risposta

6

provare a cambiare il parametro prettyPrint a

prettyPrint: function (object){ 
    return JSON.stringify(object); 
} 
1

La mia raccomandazione è di scrivere la propria astrazione su Winston che abbia un metodo comodo per stampare i propri oggetti per il debug.

Si può anche guardare questa risposta per un suggerimento su come il metodo potrebbe essere sviluppato.

https://stackoverflow.com/a/12620543/2211743

3

Utilizzare il built-in funzione di Node.js util.format per convertire gli oggetti in stringhe nello stesso modo in cui console.log fa.

3
logger.log("info", "Starting up with config %j", config); 

Winston utilizza il built-in utils.format biblioteca. https://nodejs.org/dist/latest/docs/api/util.html#util_util_format_format_args

+0

Fornire alcune spiegazioni sulla risposta al motivo per cui funziona in questo modo o su cosa l'OP stava facendo male. Solo un codice incolla come questo viene contrassegnato. –

+0

La migliore soluzione che ho visto qui. Usa l'API del registratore esistente e stampa tutto graziosamente. –