目录
一、简介
log4js
是一款用于node
开发的日志记录库,其使用范围相当之广,在Express
,Koa
系列,Hapi
等框架时,相信很多人都用过该库。其由于自身的高自由度,高可扩展性深受广大Node
开发者所喜欢。
在实际开发过程中,每个人会根据自己具体情况来进行日志文件的划分,简单的可以是单文件日志记录,稍微复杂一点根据时间切割日志,更复杂一些使用特定协议推送到日志清洗服务(如Logstash)。
这里只针对开发中特定的一个情况——根据日志等级进行日志切割
这样做的优点是可以在排查过程中,抓重点进行排查,如果出现了报错,那么直接去error
日志文件中查看错误日志;如果程序没有按照既定的逻辑运行,那么就可以去检查一下info
或者debug
日志文件中的记录……
二、本文导读
本文将会带领你如何将日志文件按照日志等级(DEBUG
、INFO
、WARN
、ERROR
、FATAL
)来将文件进行切割。
log4js
中定义的日志等级有以下几类:
DEBUG
:调试,等级最低,一般生产环境会将该等级的日志关闭INFO
:信息,普通等级,最常用的系统日志收集等级,一般会将系统运行中的一些相关信息(非开发类敏感信息)设为该等级WARN
:FBI WARNNING大家都知道,就是警告,但又不到错误ERROR
:报错,一般程序报错使用该等级FATAL
:严重,比程序报错还严重的等级,如果没做错误等级划分的话,一般FATAL
都不怎么用到,都用ERROR
替代了
这几类日志等级在标准输出流的效果如图:
在.log
文件中的效果如图
三、示例
3.1 最基础的写法
先给大家看一下最基础的用法:
const log4js = require('log4js');
const path = require('path');
const logger = log4js.getLogger();
// 设置log4js相关的配置
log4js.configure({
/**
* 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
* 都会使用该追加器写入日志文件
*/
appenders: {
default: {
type: 'file',
filename: path.join(__dirname, './logs/log.log'),
}
},
/**
* 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
*/
categories: {
default: {
appenders: ['default'], // 设置追加器为default,对应上面的appenders
level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
},
},
});
logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');
logger.fatal('fatal');
记录效果就是如上面第二节所展示的图片那样。
3.2 添加logLevelFilter
log4js
中的logLevelFilter是一种过滤器,过滤器是在追加器之上的一个概念。正常流程是:分类(category) -> [过滤器(filter)] -> 追加器(appender)
3.2.1 设置日志等级过滤器
添加4个日志等级过滤器——debugFilter
、infoFilter
、warnFilter
、errorFilter
// 设置log4js相关的配置
log4js.configure({
/**
* 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
* 都会使用该追加器写入日志文件
*/
appenders: {
default: {
type: 'file',
filename: path.join(__dirname, './logs/log.log'),
},
debugFilter: {
type: 'logLevelFilter', // 设置type为logLevelFilter
appender: 'debug', // 指定追加器为debug
level: 'debug', // 设置捕获日志的最低等级
maxLevel: 'debug', // 设置捕获日志的最高等级
},
infoFilter: {
type: 'logLevelFilter',
appender: 'info',
level: 'info',
maxLevel: 'info',
},
warnFilter: {
type: 'logLevelFilter',
appender: 'warn',
level: 'warn',
maxLevel: 'warn',
},
errorFilter: {
type: 'logLevelFilter',
appender: 'error',
level: 'error',
maxLevel: 'fatal',
},
},
/**
* 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
*/
categories: {
default: {
appenders: ['default'], // 设置追加器为default,对应上面的appenders
level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
},
},
});
3.2.2 设置过滤器对应的追加器
// 设置log4js相关的配置
log4js.configure({
/**
* 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
* 都会使用该追加器写入日志文件
*/
appenders: {
default: {
type: 'file',
filename: path.join(__dirname, './logs/log.log'),
},
/**
* 指定debug追加器
*/
debug: {
type: 'file', // 日志文件类型
filename: path.join(__dirname, './logs/debug.log'), // 日志路径+名称
},
debugFilter: {
type: 'logLevelFilter', // 设置type为logLevelFilter
appender: 'debug', // 指定追加器为debug
level: 'debug', // 设置捕获日志的最低等级
maxLevel: 'debug', // 设置捕获日志的最高等级
},
/**
* 指定info追加器
*/
info: {
type: 'file',
filename: path.join(__dirname, './logs/info.log'),
},
infoFilter: {
type: 'logLevelFilter',
appender: 'info',
level: 'info',
maxLevel: 'info',
},
/**
* 指定warn追加器
*/
warn: {
type: 'file',
filename: path.join(__dirname, './logs/warn.log'),
},
warnFilter: {
type: 'logLevelFilter',
appender: 'warn',
level: 'warn',
maxLevel: 'warn',
},
/**
* 指定error追加器
*/
error: {
type: 'file',
filename: path.join(__dirname, './logs/error.log'),
},
errorFilter: {
type: 'logLevelFilter',
appender: 'error',
level: 'error',
maxLevel: 'fatal',
},
},
/**
* 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
*/
categories: {
default: {
appenders: ['default'], // 设置追加器为default,对应上面的appenders
level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
},
},
});
3.2.3 在分类中设置对应的过滤器
追加器和过滤器已经设置好了,就差在分类中设置对应的“追加器”了。如果保持之前的代码不变,他只能将日志推送到default
追加器中。
这里如果直接推送到目的追加器是无法根据对应等级进行日志划分的,所以应该先推送到对应的过滤器中。
相关代码如下:
// 设置log4js相关的配置
log4js.configure({
/**
* 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
* 都会使用该追加器写入日志文件
*/
appenders: {
default: {
type: 'file',
filename: path.join(__dirname, './logs/log.log'),
},
/**
* 指定debug追加器
*/
debug: {
type: 'file', // 日志文件类型
filename: path.join(__dirname, './logs/debug.log'), // 日志路径+名称
},
debugFilter: {
type: 'logLevelFilter', // 设置type为logLevelFilter
appender: 'debug', // 指定追加器为debug
level: 'debug', // 设置捕获日志的最低等级
maxLevel: 'debug', // 设置捕获日志的最高等级
},
/**
* 指定info追加器
*/
info: {
type: 'file',
filename: path.join(__dirname, './logs/info.log'),
},
infoFilter: {
type: 'logLevelFilter',
appender: 'info',
level: 'info',
maxLevel: 'info',
},
/**
* 指定warn追加器
*/
warn: {
type: 'file',
filename: path.join(__dirname, './logs/warn.log'),
},
warnFilter: {
type: 'logLevelFilter',
appender: 'warn',
level: 'warn',
maxLevel: 'warn',
},
/**
* 指定error追加器
*/
error: {
type: 'file',
filename: path.join(__dirname, './logs/error.log'),
},
errorFilter: {
type: 'logLevelFilter',
appender: 'error',
level: 'error',
maxLevel: 'fatal',
},
},
/**
* 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
*/
categories: {
default: {
appenders: ['debugFilter', 'infoFilter', 'warnFilter', 'errorFilter'], // 设置追加器为上面设置的filter,对应上面的各个过滤器
level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
},
},
});
四、测试
再次使用刚才的代码,测试一下是否对日志进行了基于等级的切割。
logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');
logger.fatal('fatal');
可以看到日志文件夹中日志文件变为了如下所示:
依次打开每个文件,查看是否对应等级的日志就只写入了对应等级的日志文件中。
五、相关资料
六、结语
本文到此就结束了,说了这么多,也仅仅只是讲了log4js
中的一个小小的特性,权当我是抛砖引玉吧,哈哈哈哈哈,log4js
的灵活性与功能性还不仅仅限于此,更多更棒的用法还有待和大家继续讨论研究!