NestJS日志输出禁用颜色

395 阅读2分钟

正常来说,NestJS服务启动后,控制台是自带颜色的: image.png 我们生产环境的日志是输出到kibana平台里: image.png 这时带了颜色的话,它会转义成相应的字符串,看起来就比较丑陋了,搜索起来也不方便(因为有时分词将颜色转义的字符串与之分到一起了)。

有没有办法禁用呢?

当然是有的。

禁用方法

这时有两处需要处理的地方。

一是NestJS本身的打印。

只需要启动服务时,添加环境变量NO_COLOR=true即可。 image.png

二是我们使用的log4js的打印,也就是下面这一条: image.png

在代码中我们是这样使用的:

log4js.configure(config.log);

配置项在配置文件里,开发时是这样的,会输出日志到控制台和日志文件里:

log:
  appenders:
    console:
      type: console
    dateFile:
      type: dateFile
      filename: logs/uino
      alwaysIncludePattern: true
      daysToKeep: 10
      pattern: yyyy-MM-dd.log
      encoding: utf-8
    errorLog:
      type: dateFile
      filename: logs/error
      alwaysIncludePattern: true
      daysToKeep: 10
      pattern: yyyy-MM-dd.log
      encoding: utf-8
    error:
      type: logLevelFilter
      level: error
      appender: errorLog
  categories:
    default:
      appenders:
        - dateFile
        - console
      level: debug

但上生产以后,就只有console了:

log:
  appenders:
    console:
      type: console
  categories:
    default:
      appenders:
        - console
      level: info

粗看了下log4js的文档,没找到相关的内容,于是尝试去看下TypeScript的类型定义:

export type Appender = CategoryFilterAppender
  | ConsoleAppender
  | FileAppender
  | SyncfileAppender
  | DateFileAppender
  | LogLevelFilterAppender
  | NoLogFilterAppender
  | MultiFileAppender
  | MultiprocessAppender
  | RecordingAppender
  | StandardErrorAppender
  | StandardOutputAppender
  | CustomAppender;

找到ConsoleAppender:

/**
 * Console Appender
 *
 * @see https://log4js-node.github.io/log4js-node/console.html
 */
export interface ConsoleAppender {
  type: 'console';
  // defaults to colouredLayout
  layout?: Layout;
}

再看Layout:

export type Layout = BaseLayout | ColoredLayout | MessagePassThroughLayout | DummyLayout | PatternLayout | CustomLayout;

export interface BaseLayout {
  type: 'basic';
}

export interface ColoredLayout {
  type: 'colored' | 'coloured';
}

export interface MessagePassThroughLayout {
  type: 'messagePassThrough';
}

export interface DummyLayout {
  type: 'dummy';
}

这几个Layout里ColoredLayout明显是着色用的,那么用BaseLayout很可能就能解决问题。 于是在appenders中添加layout:

log:
  appenders:
    console:
      type: console
      layout: 
        type: "basic"

这次果然没有颜色了: image.png

再看ConsoleAppender的注释中的文档log4js-node.github.io/log4js-node…,中间有句提示: image.png

总结

禁用NestJS的日志输出时的颜色,有两处处理:

  1. 设置环境变量NO_COLOR=true,禁用NestJS本身的颜色输出。
  2. 修改log4js的配置中console的layout的type为basic。

TIPS:Deno中默认自带的颜色库(std/fmt/colors.ts)禁用颜色也是使用NO_COLOR。