log4js:
是一种node日志管理工具,可以将自定义格式的日志输出到各种渠道。对于控制台的日志输出可以呈现彩色日志,对于文件方式的日志输出,可以根据文件大小或者日期进行日志切割。
简单用法:
getLogger( ) 方法返回一个 logger 对象,将 logger 对象的 level (等级)设置为 debug (默认为OFF不会输出任何日志,所以必须设置日志等级!!!)
const log4js = require('log4js')
const logger = log4js.getLogger('self-appender')
console.log(logger.level)
正确写法如下:
const log4js = require('log4js')
// 调用 .getLogger() 可获得log4js的实例
const logger = log4js.getLogger()
// 设置日志等级
logger.level = 'error'
// 根据日志等级,输出日志
logger.error('错误日志')
注意:当未进行任何配置时,日志默认是输出带控制台,下边详细介绍到如何配置自己的appenders。
几个log4js的简单概念:
1、level :
就是日志等级。日志有了分级,log4js才能更好的为我们展示日志(不同级别的日志,在控制台中采用不同的颜色,比如:error通常是红色的),在生产可以选择的选择日志输出,比如避免一些属于.debug才用的敏感信息被泄露出来。
* log4js分为以下几个级别,级别的顺序也是按照如下排列,
logger只会打印:大于等于 logger对象设置的level等级的日志!!!
(1)track - 最低等级
(2)debug
(3)info
(4)warn
(5)error
(6)fatal - 最高等级
之前的打印的下边这条日志中的 ERROR 就是日志的等级级别:
2、类型:
log4js 还有一个概念就是category(类型),你可以设置一个Logger实例的自定义类型,按照另一个维度来区分日志:
const log4js = require('log4js')
// 调用 .getLogger() 可获得log4js的实例
const logger = log4js.getLogger('这是一个日志实例的自定义类型')
// 设置日志等级
logger.level = 'error'
// 根据日志等级,输出日志
logger.error('错误日志')
之前的 default 变为下边一段文字:
那么类型有什么用呢,它比级别更为灵活,为日志提供了第二个区分的维度,例如,你可以为不同的文件设置不同的 日志输出类型:
const log4js = require('log4js')
// 调用 .getLogger() 可获得log4js的实例
const logger = log4js.getLogger('setLogger.js')
// 设置日志等级
logger.level = 'error'
// 根据日志等级,输出日志
logger.error('错误日志')
从打印的日志中可以看出,这条日志来自于 setLogger.js 文件,这样可以区分日志来源于哪一个模块。
配置对象:
本次只对配置对象中最常用的 appenders 和 categories 进行介绍。
1、appenders - 输出源
现在日志有了级别和类型,解决了日志入口处的级别 和 分类的问题,而在 log4js 中,即日志输出到哪里、以怎么样的方式输出,就是由appender来解决的,可以将日志写入到文件、发送电子邮件、通过网络发送数据等。appenders 配置对象可以定义多个appender :
1.1 、type : 日志输出的类型,级输出到哪里,常用的类型如下:
console —— 输出至控制台;
file —— 输出指定的文件;
dataFile —— 按时间输出至不同的文件。
1.2 、当 type: 'file' 时,与其同级的属性如下:
属性 | 类型 | 含义 |
---|---|---|
filename | string | 日志保存文件的路径及文件名,./为项目根目录,('file.log') 这样写默认为项目的根目录。 |
maxLogSize? | number / string | 日志文件的最大大小(以字节为单位),如果未指定,则不会发生日志滚动 |
backups? | number | 日志滚动期间要保留的旧日志文件数,默认值为5 (只有type为 'file' 时,backups才生效 ) |
compress? | boolean | 是否压缩backups |
encoding? | string | 编码格式,默认为utf-8 |
layout? | Layout | 输出的样式 |
小例子:
log4js提供了 configure 来配置我们想要的appenders。下边把日志输出到文件,设置了日志文件的最大大小为:200字节,保留的旧日志的最大数量为5,当存储的字节超出一个日志文件所设定的数值时,会自动创建一个日志文件,创建规则:定义的日志名 + 数字 ,每次超出时都会不断创建一个新日志文件,如果超出 backups 设定的值,会把之前最先打印的日志给删除掉,。
const log4js = require('log4js')
log4js.configure({
appenders: {
// fileOut 是自定义的,在categories中会用到
// 这个fileOut里边定义的就是日志以什么方式输出,名称及大小等等 ···
fileOut: {
type: 'file',
filename: 'fileOut.log',
maxLogSize: 200, // 字节
backups: 5,
encoding: 'utf-8'
}
},
categories: {
default: {
appenders: ['fileOut'], level: "debug"
}
}
})
const logger = log4js.getLogger('self-appender')
logger.debug('error logs')
运行代码:log4js在根目录创建了fileOut.log文件:
1.3、当 type: 'dataFile' 时, 与其同级的属性如下:
属性 | 类型 | 含义 |
---|---|---|
filename | string | 文件路径及文件名,./为项目根目录 |
pattern? | string | 滚动日志的时间类型,默认为 .yyyy-MM-dd |
encoding? | string | 编码格式,默认为utf-8 |
compress? | boolean | 是否压缩滚动日志文件 |
daysToKeep? | number | 如果此值大于零,则日志滚动期间将删除早于该天数的文件,默认为0 |
alwaysIncludePattern? | boolean | 在当前日志文件名中和滚动日志一样包括pattern |
layout? | Layout | 输出的样式 |
pattern是保存滚动日志的时间分割,它的规则如下:
- yyyy : 年
- MM : 月
- dd : 日
- hh : 时
- mm : 分
- ss : 秒
- SSS : 毫秒
pattern: '.yyyy-MM-dd hh:mm:ss'
下例子:
var log4js = require('log4js');
log4js.configure({
appenders: {
dateFileOut: {
type: 'dateFile',
filename: 'datefile.log',
pattern: '.yyyy-MM-dd hh:mm:ss',
maxLogSize: 200
}
},
categories: {
myDateFileOut: {appenders: ['dateFileOut'], level: 'debug'}
}
})
var logger = log4js.getLogger('myDateFileOut');
logger.debug("日志输出");
日志文件输出如下:
1.4、日志格式 - layout
log4js通过layout设置日志格式,内置的layout有:
· basic - 包含时间戳、日志级别、日志类型基本日志格式。
· colored - 格式与basic一致,只是不同日志等级显示不同的颜色。
· dummy - 只输出第一个参数的内容,没有时间戳、日志级别、日志类型。
· pattern - 可自定义日志格式,以下是部分常用字段:
%r —— 时间为toLocalTimeString格式。
%p —— 日志级别。
%c —— 日志类别。
%h
—— 主机名。
%m
—— 记录数据。
%f ——
文件名的完整路径(enableCallStack: true
在类别上必填,请参阅配置对象)
%d —— 日期,格式默认是ISO8601, 格式选项有:ISO8601,ISO8601_WITH_TZ_OFFSET,ABSOLUTE,DATE,或与兼容的任何字符串日期格式库。例如%d{DATE},%d{yyyy/MM/dd-hh.mm.ss}。
%x{} —— 将动态令牌添加到您的日志中。令牌是在tokens参数中指定的。
%X{} —— 从Logger上下文中添加值。令牌是上下文值的键。
var log4js = require('log4js');
log4js.configure({
appenders: {
consoleOut: {
type: 'console',
layout: {
type: 'basic',
// type: 'colored',
// type: 'dummy',
// type: 'pattern', pattern:'%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %m'
}
}
},
categories: {
myConsole: {appenders: ['consoleOut'], level: 'debug'},
}
})
var logger = log4js.getLogger('myConsole');
logger.debug("日志输出");
当type:'basic' 输出如下:
当type:'colored' 输出如下:
当type:'dummy' 输出如下:
当 type: 'pattern', pattern: '%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %m' , 输出如下:
2、categorites - 类别、分类
在categories里边定义的是日志的输出的规则(这个规则就是在appenders里边定义的),还有日志等级 level。
ccategories 中共有三个属性如下:
属性 | 类型 | 含义 |
---|---|---|
appenders | string | [ ] | 上方所定义的appenders的名字,写入多个时全部输出 |
level | string | 输出的日志等级,大于等于所写的等级 |
enableCallStack? | boolean | 写样式时可使用到 |
下边categories中的default和myConsole就是在 log4js.getLogger()时自定义的类别,当log4js.getLogger()不传参数的时候,默认是default,所以它会自动去调用categories中定义的default里边的规则;如果传了参数: log4js.getLogger('myConsole'), 那么log4js会调用categories中定义的myConsole里边的规则:
const log4js = require('log4js')
log4js.configure({
appenders: {
fileOut: {
type: 'file',
filename: 'filename.log',
maxLogSize: 200,
backups: 5
},
consoleOut: {type: 'console'}
},
categories: {
default: {
appenders: ['fileOut'], level: "debug"
},
myConsole: {
appenders: ['consoleOut'], level: "debug"
}
}
})
const logger = log4js.getLogger()
// const logger = log4js.getLogger('myConsole')
logger.debug('error logs')
默认不传参数时,可以看到会根据default规则来生成日志:
当传 'myConsole' 时,会在控制台输出日志:
待续未完成。