web-dev-qa-db-fra.com

Comment un humain lirait-il un fichier journal JSON Winston?

Cela semble bien pour les API, les scripts et autres. Mais la lecture d'une trace de pile Winston Json est très difficile avec un éditeur de texte. Par exemple.

{"level":"info","message":"starting","timestamp":"2014-05-14T15:45:44.334Z"}
{"date":"Wed May 14 2014 08:45:45 GMT-0700 (Pacific Daylight Time)","process":{"pid":8804,"uid":null,"gid":null,"cwd":"C:\\data\\mytool","execPath":"C:\\Program Files\\nodejs\\node.exe","version":"v0.10.21","argv":["node","C:\\data\\mytool\\server"],"memoryUsage":{"rss":45199360,"heapTotal":32171264,"heapUsed":15158096}},"os":{"loadavg":[0,0,0],"uptime":70496.6138252},"trace":[{"column":null,"file":null,"function":"Object.parse","line":null,"method":"parse","native":true},{"column":32,"file":"C:\\data\\mytool\\src\\status.js","function":"Request._callback","line":166,"method":"_callback","native":false},{"column":22,"file":"C:\\data\\mytool\\node_modules\\request\\request.js","function":"Request.self.callback","line":122,"method":"self.callback","native":false},{"column":17,"file":"events.js","function":"Request.EventEmitter.emit","line":98,"method":"EventEmitter.emit","native":false},{"column":14,"file":"C:\\data\\mytool\\node_modules\\request\\request.js","function":"","line":888,"method":null,"native":false},{"column":20,"file":"events.js","function":"Request.EventEmitter.emit","line":117,"method":"EventEmitter.emit","native":false},{"column":12,"file":"C:\\data\\mytool\\node_modules\\request\\request.js","function":"","line":839,"method":null,"native":false},{"column":20,"file":"events.js","function":"IncomingMessage.EventEmitter.emit","line":117,"method":"EventEmitter.emit","native":false},{"column":16,"file":"_stream_readable.js","function":null,"line":920,"method":null,"native":false},{"column":13,"file":"node.js","function":"process._tickCallback","line":415,"method":"_tickCallback","native":false}],"stack":["SyntaxError: Unexpected end of input","    at Object.parse (native)","    at Request._callback (C:\\data\\mytool\\src\\status.js:166:32)","    at Request.self.callback (C:\\data\\mytool\\node_modules\\request\\request.js:122:22)","    at Request.EventEmitter.emit (events.js:98:17)","    at Request.<anonymous> (C:\\data\\mytool\\node_modules\\request\\request.js:888:14)","    at Request.EventEmitter.emit (events.js:117:20)","    at IncomingMessage.<anonymous> (C:\\data\\mytool\\node_modules\\request\\request.js:839:12)","    at IncomingMessage.EventEmitter.emit (events.js:117:20)","    at _stream_readable.js:920:16","    at process._tickCallback (node.js:415:13)"],"level":"error","message":"uncaughtException: Unexpected end of input","timestamp":"2014-05-14T15:45:45.228Z"}
29
ubershmekel

Définissez simplement la propriété "json" de transport de fichiers sur false, et vous obtiendrez un journal lisible par l'homme. Identique à la console.

    var winston = require('winston');
    var logger = new winston.Logger({
      transports: [
        new winston.transports.File({
          json: false,
          filename:'log.log'
        }),
        new winston.transports.Console()
      ],
      exitOnError: false
    });
   logger.log('info', 'some msg');
20
MichaelS

Passez-le dans jq , ce qui ressemble à sed pour JSON. Par exemple.:

jq . file.log
13
weiyin

Pourquoi ne pas simplement l'exécuter via un formateur JSON sur la ligne de commande

par exemple. (exemple du lien ci-dessus)

echo '{ element0: "lorem", element1: "ipsum" }' | python -mjson.tool

Une alternative peut consister à créer un script Shell autour de l'outil ci-dessus (ou peut-être) jq pour effectuer une analyse de trace de pile personnalisée.

4
Brian Agnew

Si vous utilisez Keen.IO -, leur outil CLI peut télécharger le JSON délimité par ligne, vous pouvez alors utiliser leur "Explorateur" pour filtrer/afficher les événements du journal.

keen events:add --collection myLogs --file winston-output.json

2
simbolo

C'est lent, mais votre shell peut le faire, obtenir un JSON formaté et coloré. 

./thing | ndjson

 asciicast

Comment?

Vous exécutez une commande de formatage JSON sur chaque ligne. La syntaxe bash ou zsh est la suivante:

./thing | while read in ; do echo "$in" | python -m json.tool ; done

Pour fish, la syntaxe est la suivante:

./thing | while read in; echo "$in" | python -mjson.tool; end #fish

Pour le rendre encore plus sophistiqué, il suffit de pip install pygments.

Définissez un alias pratique pp afin d'exécuter cat file.json | pp.

alias pp="python -mjson.tool | pygmentize -l js"

Et ensuite définir ndjson

alias ndjson='while read in; do echo "$in" | pp; done'

Vous pouvez maintenant saisir ce qui suit pour obtenir un JSON formaté et coloré. 

./thing | ndjson

(utilisez funced et funcsave pour définir un alias dans fish)

1
wires

Vous devriez essayer winston-logs-display

Sortie de démonstration:

 winston-logs-display output

Aussi Log.io est une bonne option pour cela. il supporte winston log.

1
Vikas Kapadiya

Il semble que le nœud bunyan du nœud dispose de fonctionnalités vous permettant de filtrer et d'afficher les journaux JSON de manière lisible par l'homme avec un CLI .

$ node hi.js | bunyan -l warn
[2013-01-04T19:08:37.182Z]  WARN: myapp/40353 on banana.local: au revoir (lang=fr)

bunyan CLI output

1
ubershmekel