log4js 日志库
Java中有一个比较流行的日志库Log4J,而Node.js中的log4js就是仿照它设计的,如果熟悉Java我们会对其中的配置十分亲切。
相关概念
Level 日志级别:log4js有9个日志级别,ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、MARK、OFF,第一个表示所有日志都输出,最后一个表示所有日志都不输出,其余按顺序级别越来越高,具体输出时会按照输出同级别或更高级别的规则输出。
Category:log4js中获取logger对象时可以给它起一个分类名(Category),日志输出时会带上这个名字,方便区分该条日志属于哪个模块。如果不指定该名,默认为default。
Appender:log4js默认会向控制台输出内容,这是因为框架内部默认使用输出到控制台的Appender,如果需要向文件输出就需要手动指定一个file的Appender,除此之外log4js还内置了其它类型的Appender供我们使用,具体可以参考文档。
日志卷动(rotate):我们不可能将所有的日志输出到1个文件中,那可能造成日志文件过于庞大而无法打开,我们也不能无限制的写入日志(毕竟应用服务器的磁盘空间的有限的),而是应该配置一个自动删除老日志内容的机制,这种机制在日志框架中就叫做Rotate(卷动)。一般日志框架都支持按照文件大小和日期来卷动日志文件。
log4js安装
我们在项目中执行以下命令安装log4js模块:
npm install --save log4js
我这里使用的版本的6.9.0。
log4js简单使用
下面代码演示了log4js的简单使用方式,这里我们没有加入什么额外的配置参数,保持日志框架的默认配置并输出了一些内容。
var log4js = require("log4js");
// 获取日志记录器实例
var logger = log4js.getLogger("index");
// 设置日志记录器日志级别
logger.level = "debug";
// 输出日志信息
logger.debug("Some debug messages");
代码中,我们输出了日志信息到控制台。具体输出内容如下:
[2023-03-08T15:13:54.508] [DEBUG] index - Some debug messages
这里获取日志记录器时我们指定了一个名字index,如果未指定默认会显示default。
log4js配置
这里我们简单介绍如何对log4js输出的内容进行配置,下面代码是一个配置例子。
const log4js = require('log4js');
const log4jsConfig = {
replaceConsole: true,
appenders: {
out: {
type: 'stdout',
layout: {
type: 'pattern',
pattern: '{"date":"%d","level":"%p","category":"%c","host":"%h","pid":"%z","data":"%m"}'
}
}
},
categories: {
default: {
appenders: ['out'],
level: 'info'
}
}
};
log4js.configure(log4jsConfig);
const logger = log4js.getLogger();
logger.info('Hello, log4js!');
我们主要关注代码中的log4jsConfig对象,replaceConsole表示覆盖掉框架默认配置;appenders中指定了配置哪些Appender,例子中我们使用了stdout,它会向标准输出写日志,此外常用的还有file、datefile等。layout指定日志的输出格式,常用的有:
basic:纯文本方式输出日志。coloured:相比basic还增加了不同级别日志的颜色,但这里注意带颜色的日志需要控制台支持,否则可能造成乱码等情况。pattern:该方式可以手动指定日志的格式,log4js默认的输出格式是Java风格的,对于其它风格或是结构化日志(JSON格式)等,可以使用该项手动编写日志格式。
categories指定了不同日志记录器使用的Appender和日志级别,default表示所有未特殊指定的日志记录器使用该配置输出。
file 输出日志文件
file类型的Appender可以将日志输出到文件,它可以指定输出的最大文件大小、配置按日志文件个数卷动、指定是否压缩等。
const log4jsConfig = {
replaceConsole: true,
appenders: {
file: {
type: 'file',
filename: 'logs/node-app.log',
layout: {
type: 'basic'
},
maxLogSize: 1024 * 1024 * 1024,
backups: 3,
encoding: 'utf-8',
compress: true
}
},
categories: {
default: {
appenders: ['file'],
level: 'info'
}
}
};
filename:指定输出的日志文件名,可以带有路径maxLogSize:指定单个日志文件的最大文件大小,单位为字节backups:指定达到多少个文件后开始卷动(超出的文件将被删除)encoding:日志文件的文本编码compress:分卷的日志是否压缩,默认以.gz格式压缩
按照如上配置最终会以类似下列的形式卷动日志文件:
logs
|_node-app.log
|_node-app.log.1.gz
|_node-app.log.2.gz
|_node-app.log.3.gz
datefile 输出带日期的日志文件
前面的file是按日志文件尺寸卷动的,datefile则可以按日期卷动,下面是一个配置例子。
const log4jsConfig = {
replaceConsole: true,
appenders: {
datefile: {
type: 'datefile',
filename: 'logs/node-app.log',
pattern: 'yyyy-MM-dd',
alwaysIncludePattern: true,
layout: {
type: 'basic'
},
keepFileExt: true,
numBackups: 3,
encoding: 'utf-8'
}
},
categories: {
default: {
appenders: ['datefile'],
level: 'info'
}
}
};
alwaysIncludePattern:配置是否所有的日志文件都带有日志,设置为false时卷动前的日志文件不会带上日期keepFileExt:保持日志文件的文件名,如果不配置该项可能会造成我们的日志文件名变成node-app.log.2023-03-08,由于文件名改变了,这可能造成某些日志收集系统的不兼容numBackups:日志文件卷动时,保留的最大日志份数
其余配置前面已经介绍过了,这里就不重复赘述了。
以下配置会输出如下格式文件名的日志文件:
logs
|_node-app.2023-03-06.log
|_node-app.2023-03-07.log
|_node-app.2023-03-08.log