温斯顿不能漂亮地打印到控制台
Posted
技术标签:
【中文标题】温斯顿不能漂亮地打印到控制台【英文标题】:Winston doesn't pretty-print to console 【发布时间】:2013-07-31 13:36:18 【问题描述】:我试图让 Winston 漂亮地打印到控制台,所以我将它保存在一个文件中并使用 node 运行它:
var winston = require('winston');
winston.cli();
winston.data(
a: "test",
of: "many",
properties:
like: "this"
);
winston.data('data',
a: "test",
of: "many",
properties:
like: "this"
);
终端返回以下(不完全漂亮)消息:
data: a=test, of=many, like=this
data: data a=test, of=many, like=this
我正在按照Winston Readme(“在 CLI 工具中使用 winston”)中的说明进行操作。我误读了什么吗?某处缺少设置?
【问题讨论】:
【参考方案1】:我找到了答案(文档不正确)。如果您使用构造函数并手动添加传输,则可以为 winston 和单个传输设置选项。某些选项需要直接添加到 winston 中,而其他选项需要添加到传输中。
例如:
var winston = require('winston');
var logger = new (winston.Logger)(
levels:
trace: 0,
input: 1,
verbose: 2,
prompt: 3,
debug: 4,
info: 5,
data: 6,
help: 7,
warn: 8,
error: 9
,
colors:
trace: 'magenta',
input: 'grey',
verbose: 'cyan',
prompt: 'grey',
debug: 'blue',
info: 'green',
data: 'grey',
help: 'cyan',
warn: 'yellow',
error: 'red'
);
logger.add(winston.transports.Console,
level: 'trace',
prettyPrint: true,
colorize: true,
silent: false,
timestamp: false
);
logger.add(winston.transports.File,
prettyPrint: false,
level: 'info',
silent: false,
colorize: true,
timestamp: true,
filename: './nKindler.log',
maxsize: 40000,
maxFiles: 10,
json: false
);
【讨论】:
级别上的数字不应该倒序吗?例如。错误 = 0 和跟踪 = 9 github.com/winstonjs/winston#logging-levels【参考方案2】:我接受了@partycoder 的回答并将其精简为仅使用winston 附带的默认日志记录级别。它也不会颠倒错误的顺序。 0 = 最高优先级。
winston.addColors(
silly: 'magenta',
debug: 'blue',
verbose: 'cyan',
info: 'green',
warn: 'yellow',
error: 'red'
);
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console,
level: process.env.LOG_LEVEL,
prettyPrint: true,
colorize: true,
silent: false,
timestamp: false
);
【讨论】:
【参考方案3】:如果您使用的是winston@3.0.0-rc0,那么接受的答案将不起作用。请尝试以下操作:
const winston = require("winston");
let date = new Date().toISOString();
const logFormat = winston.format.printf(function(info)
return `$date-$info.level: $JSON.stringify(info.message, null, 4)\n`;
);
const logger = winston.createLogger(
transports: [
new winston.transports.Console(
level: level,
format: winston.format.combine(winston.format.colorize(), logFormat)
)
]
);
日志将具有以下格式:
顺便说一句,它是彩色的
2018-03-01T19:49:54.042Z-info: "----- Customer Details ------"
2018-03-01T19:49:54.042Z-info: [
"A": 1,
"B": 2
]
【讨论】:
这应该成为接受的答案@JoBu1324 这会将日期硬编码为一个值,并且不会在日志消息中记录正确的日期 - 它们都是相同的(如示例所示)。【参考方案4】:这是 Winston v3+ 的解决方案
let winstonFormat = winston.format.json();
if (NODE_ENV == "development")
winstonFormat = winston.format.combine(winston.format.json(), winston.format.prettyPrint());
const log = winston.createLogger(
level: "info",
format: winstonFormat,
defaultMeta: app: "myapp",
transports: [
new winston.transports.File(filename: "/dev/stderr", level: "warn"),
new winston.transports.File(filename: "/dev/stdout"),
],
);
【讨论】:
【参考方案5】:我也遇到了同样的问题,但我是在 git 上遇到的,发现了一些有趣的技巧,可能会对它有所帮助。 issue #1217
首先,诀窍在于使用
JSON.stringify(jsonData, null, 4) // This helps indent lines and make them readable
您可以在下面的这个 Visual Studio 代码屏幕截图中看到它,以获得清晰的文档 how to use JSON.stringify
例如,如果您使用控制台传输器,您可以这样创建它
transports: [
new winston.transports.Console(
format: printf((info) =>
return `$info.timestamp [$info.label] [$info.level] : $info.message\n
$JSON.stringify(info.meta, null, 4)`; // Meta as additional data you provide while logging
;
)
)
]
并像使用它
Logger.info("Message text", meta: metaDataHere )
【讨论】:
printf 来自哪里?以上是关于温斯顿不能漂亮地打印到控制台的主要内容,如果未能解决你的问题,请参考以下文章