最近在看公司的项目,日志管理用的是nodejs 的日志模块log4js。然后看了一下网上的一些资料和官方的文档。写一下自己的一些理解。
基本的理解就是:
"log4js": "^3.0.6"
- 入口-分级 最近的log4js 默认输出的不同级别的日志分类,分别配有不同的颜色
- 入口-分类
logger = log4js.getLogger('CHEESE');
便于日志中区分不同的日志 - 入口-作用 显而易见,后台日志种可以区分不同分类的日志,然后控制台的打印可以更好的生产/开发
- 出口-输出位置 通过appender 多种输出方式:控制台、SMTP、file、Mailgun.
- 出口-输出样式 basic、colored、pattern、messagePassThrough
安装日志模块
npm install log4js
log4js 2.0 版本以上 stdout 作为默认 appender, 推荐使用 stdout 而不是 console 打印控制台日志 appender-console 在大量日志输出时会占用 v8 大量内存,拖慢系统性能,不推荐使用 !
简单使用
基本的用法:三部曲
// file: logger.js
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Time:", new Date());
引入log4js包,然后调用 getLogger()实例化。
复制代码
明确指定 category 和 appender
代码结构
复制代码
let logConfig = {
// 输出到控制台的内容,同时也输出到日志文件中
replaceConsole: true,
appenders: {
'out': {
type: 'stdout',
layout: {
type: "colored"
}
},
'files': {
type:'file',
filename: 'testing.log'
}
},
categories: {
default: {
appenders: ['out', 'files'],
level: appLogLevel
}
},
disableClustering: true
}
log4js.configure(logConfig)
const logger = log4js.getLogger('CHEESE');
复制代码
上述代码会直接将日志同时输出至控制台和testing.log 文件中
复制代码
1.首先看一下不同type 输出的样式
Layout 是 log4js 提供的高级功能,通过 layout 我们可以自定义每一条输出日志的格式。log4js 内置了四中类型的格式:
messagePassThrough:仅仅输出日志的内容;
basic:在日志的内容前面会加上时间、日志的级别和类别,通常日志的默认 layout;
colored/coloured:在 basic 的基础上给日志加上颜色,appender Console 默认使用的就是这个 layout;
pattern:这是一种特殊类型,可以通过它来定义任何你想要的格式。
复制代码
这段话摘自Node.js 之 log4js 完全讲解 但是不建议看这个文章,已经是旧版本的。。。。 basic
layout: {
type: "basic"
}
复制代码
messagePassThrough
layout: {
type: "messagePassThrough"
}
复制代码
pattern
layout: {
type: "pattern",
pattern: '{"date":"%d","level":"%p","category":"%c","host":"%h","pid":"%z","data":\'%m\'}'
}
复制代码
colored
layout: {
type: "colored"
}
复制代码
)
然后,类似于console的一些输出功能。log4js 对不同的类型的输出都采用了不一样的颜色,看下面的图
复制代码
看一下源码,就知道内部将每个等级定义的颜色:
复制代码
Level.addLevels({
ALL: { value: Number.MIN_VALUE, colour: 'grey' },
TRACE: { value: 5000, colour: 'blue' },
DEBUG: { value: 10000, colour: 'cyan' },
INFO: { value: 20000, colour: 'green' },
WARN: { value: 30000, colour: 'yellow' },
ERROR: { value: 40000, colour: 'red' },
FATAL: { value: 50000, colour: 'magenta' },
MARK: { value: 9007199254740992, colour: 'grey' }, // 2^53
OFF: { value: Number.MAX_VALUE, colour: 'grey' }
});
复制代码
2.然后就是上面说到的如何区分不同的日志呢?
很简单只要在代码实例化的时候给起一个名字就可以,也是getLogger唯一可以出入的`category`值
那类别有什么用呢,它比级别更为灵活,为日志了提供了第二个区分的维度,例如,你可以为每个文件设置不同的 category
const logger = log4js.getLogger('CHEESE');
复制代码
3.输出日志
stdout 保存 //默认输出伟stdout
let logConfig = {
appenders: {
'out': {
type: 'stdout',
layout: {
type: "colored"
}
}
},
categories: {
default: {
appenders: ['out'],
level: appLogLevel
}
},
disableClustering: true
}
复制代码
直接在控制台输出,看一下输出的样式
复制代码
file保存
type : “file” 首先指定 appenders 的类型为 file
filename : 用于指定日志落盘的文件地址 ( ps : “logs/myLog.log” )
layout : 选择日志输出的格式,默认 basic
maxLogSize : 单文件最大限制 ( 单位 : bytes )
backups : 旧日志最大数量
encoding : 编码格式 (默认 “utf-8”)
mode : 默认 0644 无需配置,使用默认即可
flags : 默认 “a”,无需配置,使用默认即可
compress : compress 为 true,记录当天日志时,会对以往的老日志进行压缩操作,压缩文件后缀为 .gz (默认 : false)
keepFileExt : 是否保持日志文件后缀名 ( 默认为 false,使用 pattern 的情况下,保持默认就好 )
复制代码
const appenders = {}
let logConfig = {
appenders: {
'files': {
type: 'file',
filename: 'test.log',
// 这个地方其实不需要了,文件中是不会有五颜六色的名字的
<!--layout: {-->
<!-- type: "colored"-->
<!--}-->
}
},
categories: {
default: {
appenders: ['files'],
level: appLogLevel
}
},
disableClustering: true
}
log4js.configure(logConfig)
const logger = log4js.getLogger('CHEESE');
logger.info('这里面是需要输出的内容')
复制代码
结果已经保存在test.log 文件中
复制代码
datefile保存
type : “dateFile” 首先指定 appenders 的类型为 dateFile
filename : 用于指定日志落盘的文件地址 ( ps : “logs/test.log” )
pattern : 用于指定日志切分的时间间隔
“.yyyy-MM” 精确到月
“.yyyy-MM-dd” 精确到天
“.yyyy-MM-dd-hh” 精确到小时
layout : 选择日志输出的格式,该例子中使用 pattern,其余类型会额外总结
encoding : 编码格式 (默认 “utf-8”)
mode : 默认 0644 无需配置,使用默认即可
flags : 默认 “a”,无需配置,使用默认即可
compress : compress 为 true,记录当天日志时,会对以往的老日志进行压缩操作,压缩文件后缀为 .gz (默认 : false)
alwaysIncludePattern : 当为 true 时,log 文件名会包含之前设置的 pattern 信息 (默认为 false,但是强烈建议开启)
alwaysIncludePattern 为 true 时,日志名例如 : test.log-2019-08-06
alwaysIncludePattern 为 false 时,日志名例如 : test.log
daysToKeep : 指定日志保留的天数 ( 默认为 0,始终保留 )
keepFileExt : 是否保持日志文件后缀名 ( 默认为 false,使用 pattern 的情况下,保持默认就好 )
只有在 alwaysIncludePattern 为 false 时生效
复制代码
pattern 配置项解析
%r 日志输出时间,以 toLocaleTimeString 函数格式化
%p 日志等级
%c 日志分类
%h 访问计算机的 hostname
%m 打印的日志主题内容
%n 换行标识
%d 日志输出日期 ( 默认以 ISO8601 方式格式化 )
可自定义输出类型 %d{yyyy/MM/dd-hh.mm.ss},输出 2018/05/22-15.42.18
%z 记录进程 pid 号 ( 数据来自 node 方法 process.pid )
%x{} 输出自定义 tokens 中的项目,例如上述例子中的 user
%[ 想要输出的内容 %] 用来给被扩起来的内容着色,颜色和日志 level 有关
复制代码
let logConfig = {
appenders: {
'files': {
type: 'datefile',
filename: 'test.log',
pattern: '-yyyy-mm-dd.log',
//包含模型 不加这一句的话和上面的方式 输出一样
alwaysIncludePattern: true
}
},
categories: {
default: {
appenders: ['files'],
level: appLogLevel
}
},
disableClustering: true
}
复制代码
下面是输出的文件内容
复制代码
levelFilter 过滤筛选
shenyujie.cc/2018/05/25/… 这链接比较新。大家可以参考一下
来源:CSDN
作者:thlzjfefe
链接:https://blog.csdn.net/thlzjfefe/article/details/103722997