39

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

12 回答 12

23

只需将文件传输“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');
于 2014-12-28T12:24:10.773 回答
16

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

jq . file.log
于 2015-05-12T16:45:27.090 回答
4

为什么不在命令行上通过 JSON 格式化程序运行它呢?

例如(来自上面链接的示例)

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

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

于 2014-05-14T16:10:53.883 回答
4

您应该尝试winston-logs-display

演示输出:

温斯顿日志显示输出

Log.io也是一个不错的选择。它支持温斯顿日志。

于 2017-01-31T18:35:37.147 回答
2

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

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

于 2015-07-03T10:53:50.127 回答
2

我知道我迟到了,但有一个简单的方法。

  1. 在浏览器中打开一个新标签
  2. 打开开发工具
  3. 运行此代码
const entries = prompt('Log Data').split('\n').map(JSON.parse);

console.table(entries);

在提示中输入您的日志数据,然后按 Enter。

现在您有了日志条目的交互式表格视图。您可以单击标题进行排序,甚至可以右键单击某些选项。您还可以调整列的大小。

要查看某些条目,请执行

console.log(entries.filter(entry => entry.foo.bar > 323)); // Just an example, you can do anything with the array

全屏查看 devtools 以查看更多数据。

于 2021-02-19T17:33:43.023 回答
1

万一它有帮助(在最后一次响应之后这么多年),我合成了一条命令,它甚至允许 python 2.7 获取实时输出tail -f winston.log并通过 python 的 json.tool 管道输出用于漂亮的印刷。

tail -f winston.log | while read -r line; do echo -n "$line" | python -m json.tool; done

(请注意,如果您使用的是 python 3.8 及更高版本,则参数--json-lines提供给 json.tool 时,应该消除对 while..do 药水的需要)。

于 2020-01-28T00:32:35.473 回答
1

似乎节点的bunyan具有允许您使用CLI以人类可读的方式过滤和查看 json 日志的功能。

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

bunyan CLI 输出

于 2016-03-08T05:28:39.363 回答
1

它很慢,但你的 shell 可以做到,得到格式化、彩色的 JSON。

./thing | ndjson

asciiccast

如何?

您在每一行上运行一些 JSON 格式化命令,bash或者zsh语法是:

./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

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

然后定义ndjson

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

现在您可以键入以下内容以获取格式化的彩色 JSON。

./thing | ndjson

(使用funcedfuncsave定义别名fish

于 2017-01-28T23:34:07.090 回答
0

我通过编写一个 npm 包(用法:)解决了这个问题,tail -f logFile.log | npx winston-log-viewer你可以在这里看到完整的描述

https://stackoverflow.com/a/68455246/4650625

于 2021-07-21T09:44:36.423 回答
0

我使用lnav:我在某种程度上支持 json-logs :即您可以轻松定义自己的log-format。通过这种方式,您可以根据需要优化显示(即,使其与您的 winston 日志输出相匹配。

这是我们的 lnav-log-config 的一个简单示例:

{
  "$schema": "https://lnav.org/schemas/format-v1.schema.json",
  "winston": {
    "title": "My Custom Json log format",
    "description": "Custom JSON-log format for winston",
    "url": "https://github.com/winstonjs/winston#formats",
    "file-pattern": "\\.jsonlog",
    "json": true,
    "level-field": "level",
    "timestamp-field": "timestamp",
    "body-field": "message",
    "line-format": [
      {
        "field": "__timestamp__"
      },
      " ",
      {
        "field": "__level__",
        "text-transform": "uppercase"
      },
      " ",
      {
        "field": "message"
      }
    ]
  }
}

注意:我使用"file-pattern": "\\.jsonlog",: 根据需要更改或删除它。

lnav甚至可以在我的 WSL2 中使用。
照常安装:sudo apt install lnav

于 2021-03-30T16:20:01.790 回答
0

如果你想在控制台可视化winston json 日志,你可以使用 munia-pretty-json

您的 json 数据 (app-log.json)

{"time":"2021-06-09T02:50:22Z","level":"info","message":"Log for pretty JSON","module":"init","hostip":"192.168.0.138","pid":123}
{"time":"2021-06-09T03:27:43Z","level":"warn","message":"Here is warning message","module":"send-message","hostip":"192.168.0.138","pid":123}

运行命令:

munia-pretty-json app-log.json

这是控制台上的可读输出:

在此处输入图像描述

您可以使用模板格式化输出。默认模板是'{time} {level -c} {message}'

使用模板:

munia-pretty-json -t '{module -c} - {level} - {message}' app-log.json

输出: 在此处输入图像描述

于 2021-11-18T11:26:20.587 回答