Winston 3.0 在控制台上为整个输出着色
Posted
技术标签:
【中文标题】Winston 3.0 在控制台上为整个输出着色【英文标题】:Winston 3.0 colorize whole output on console 【发布时间】:2018-12-03 08:39:33 【问题描述】:我正在开发一个 Node.js 应用程序,使用 babel-cli 作为 ES6 转译器,我使用 Winston 3.0 作为我的日志记录服务。
问题:
我希望来自 winston 记录器的消息的全部输出以彩色显示,不仅是标签和消息,还有时间戳。我知道,在 Winston 2.x 中这在某些方面是可能的(但不知道如何)。
我已经尝试过不同的 NPM 包,例如 winston color 和 winston-console-formatter,但它们似乎不起作用。
我已将我的记录器定义如下:
import winston from 'winston'
let alignColorsAndTime = winston.format.combine(
winston.format.colorize(
all:true
),
winston.format.label(
label:'[LOGGER]'
),
winston.format.timestamp(
format:"YY-MM-DD HH:MM:SS"
),
winston.format.printf(
info => ` $info.label $info.timestamp $info.level : $info.message`
)
);
export const logger = winston.createLogger(
level: "debug",
transports: [
new (winston.transports.Console)(
format: alignColorsAndTime
)
],
);
输出仍然是这样的:
虽然我希望它看起来像这样:
【问题讨论】:
【参考方案1】:试试下面的代码。它将结合两种格式。它对我有用。
let alignColorsAndTime = winston.format.combine(
winston.format.colorize(
all:true
),
winston.format.label(
label:'[LOGGER]'
),
winston.format.timestamp(
format:"YY-MM-DD HH:MM:SS"
),
winston.format.printf(
info => ` $info.label $info.timestamp $info.level : $info.message`
)
);
export const logger = winston.createLogger(
level: "debug",
transports: [
new (winston.transports.Console)(
format: winston.format.combine(winston.format.colorize(), alignColorsAndTime)
)
],
);
注意填充必须处理颜色。例如:
const padding= info.level.length <= 7?7:17; //padding differently if it has colour.
$info.level.padEnd(padding,' ')
测试:
"winston": "^3.1.0"
【讨论】:
标识符alignColorsAndTime
从何而来?
@MEMark 来自问题。【参考方案2】:
另一个想法:
const createLogger, format, transports = require('winston');
const combine, timestamp, label, printf = format;
const colorizer = winston.format.colorize();
const logger = winston.createLogger(
levels:
error: 0,
warn: 1,
info: 2,
debug: 4
,
format: combine(
winston.format.timestamp(),
winston.format.simple(),
winston.format.printf(msg =>
colorizer.colorize(msg.level, `$msg.timestamp - $msg.level: $msg.message`)
)
),
transports: [
new (winston.transports.Console)(
// format: winston.format.combine(winston.format.colorize(), alignColorsAndTime),
prettyPrint: true,
colorize: true,
timestamp: true,
),
],
);
【讨论】:
【参考方案3】:来自这篇帖子https://github.com/winstonjs/winston/issues/1388
const colorizer = winston.format.colorize();
const logger = winston.createLogger(
level: 'debug',
format: combine(
winston.format.timestamp(),
winston.format.simple(),
winston.format.printf(msg =>
colorizer.colorize(msg.level, `$msg.timestamp - $msg.level: $msg.message`)
)
),
transports: [
new transports.Console(),
]
);
【讨论】:
【参考方案4】:只需使用addColors()
方法
const createLogger, format, transports, addColors = require('winston');
const combine, colorize, label, timestamp, json, prettyPrint, printf = format;
require('winston-mongodb');
let myCustomFormat = format.combine(
colorize(
all: true
),
label(
label: '[LOGGER]'
),
timestamp(
format: 'YY-MM-DD HH:MM:SS'
),
printf((info) => ` $info.label $info.timestamp $info.level : $info.message`));
addColors(
info: 'bold blue', // fontStyle color
warn: 'italic yellow',
error: 'bold red',
debug: 'green');
const logger = createLogger(
level: 'info',
transports: [ new transports.Console(format: combine(myCustomFormat))]
);
这对我自定义颜色和字体样式很有用。 文档中可能的选项如下。
Font styles: bold, dim, italic, underline, inverse, hidden, strikethrough.
Font foreground colors: black, red, green, yellow, blue, magenta, cyan, white, gray, grey.
Background colors: blackBG, redBG, greenBG, yellowBG, blueBG magentaBG, cyanBG, whiteBG
【讨论】:
一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 基本上,这个问题应该是一个解决方案,其中输出应该看起来像这样i.stack.imgur.com/BqXev.png这个图像(粗体和彩色)。根据文档,winston 提供了一个名为 addColors( ) 的方法,在其他给定的解决方案中没有提到它。这是我对现有解决方案所做的唯一新更改。希望这会有所帮助。 这应该是最佳答案 这对我有用,但我必须在传输中添加一个format.colorize(all: true)
作为@mehedihasan 代码。【参考方案5】:
这将着色并以可读格式显示时间。并将所有错误也存储到一个文件中!
import createLogger, format, transports from 'winston'
const loggerFormat = format.combine(
format.timestamp(),
format.printf((info) =>
return `$info.timestamp - [$info.level.toUpperCase().padEnd(7)]: $
info.message
`
),
format.colorize(
all: true,
)
)
const logger = createLogger(
format: loggerFormat,
transports: [
new transports.Console( level: 'silly' ),
new transports.File( filename: 'error.log', level: 'error' ),
],
)
export default logger
【讨论】:
以上是关于Winston 3.0 在控制台上为整个输出着色的主要内容,如果未能解决你的问题,请参考以下文章