人类如何阅读json winston日志文件?

API,脚本看起来不错。 但是用文本编辑器阅读winston json堆栈跟踪非常困难。 例如

{"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"} 

只需将文件传输“json”属性设置为false,就可以获得人类可读的日志。 和你在控制台中看到的一样。

  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'); 

通过jq传递,就像JSON的sed。 例如:

 jq . file.log 

为什么不直接通过命令行上的JSON格式化程序运行?

例如(例如从上面的链接)

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

另一种方法可能是查看围绕上述工具(或可能) jq构build一个shell脚本来执行一些自定义堆栈跟踪parsing

如果您使用Keen.IO – 他们的CLI工具可以上传行删除的JSON,那么您可以使用他们的“资源pipe理器”来过滤/查看日志事件。

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

你应该试试winston-logs-display 。

演示输出:

winston-logs-display输出

此外Log.io是不错的select。 它支持winston日志。

似乎节点的bunyan具有可以使用CLI以可读的方式过滤和查看json日志的function。

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

bunyan CLI输出

这很慢,但你的shell可以做到,格式化,着色JSON。

 ./thing | ndjson 

asciicast

怎么样?

您在每行上运行一些JSON格式化命令, bashzsh语法是:

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

对于fish的语法是

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

为了使它更加花哨,只需要pip install pygments

定义一个方便的别名pp ,所以你运行cat file.json | pp cat file.json | pp

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

然后定义ndjson

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

现在你可以input以下内容来获得格式化,着色的JSON。

 ./thing | ndjson 

(使用funcedfuncsave来定义fish别名)