正常来说,NestJS服务启动后,控制台是自带颜色的:
我们生产环境的日志是输出到kibana平台里:
这时带了颜色的话,它会转义成相应的字符串,看起来就比较丑陋了,搜索起来也不方便(因为有时分词将颜色转义的字符串与之分到一起了)。
有没有办法禁用呢?
当然是有的。
禁用方法
这时有两处需要处理的地方。
一是NestJS本身的打印。
只需要启动服务时,添加环境变量NO_COLOR=true即可。
二是我们使用的log4js的打印,也就是下面这一条:
在代码中我们是这样使用的:
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"
这次果然没有颜色了:
再看ConsoleAppender的注释中的文档log4js-node.github.io/log4js-node…,中间有句提示:
总结
禁用NestJS的日志输出时的颜色,有两处处理:
- 设置环境变量NO_COLOR=true,禁用NestJS本身的颜色输出。
- 修改log4js的配置中console的layout的type为basic。
TIPS:Deno中默认自带的颜色库(std/fmt/colors.ts)禁用颜色也是使用NO_COLOR。