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 在控制台上为整个输出着色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ANSI Escape 代码在控制台上输出彩色文本

如何去掉控制台上输出的这些日志

如何将我的节点 winston JSON 输出更改为单行

在Intellij产品中着色控制台输出

python控制台上面的annotations怎么取消

如何在控制台上的同一位置写入输出?