log4js 是 Node.js 日志处理中的数一数二的模块。在项目中使用 log4js管理日志,可以使开发调试更容易,线上更好地监控或排查问题。
一、原生log4js的使用
1.安装log4js日志管理工具
在控制台输入命令:yarn add log4js -D
当package.json中出现以下结果说明安装成功:
2.log4js基本使用
引入log4js,并创建log4js实例对象。
var log4js = require("log4js");
var logger = log4js.getLogger();
logger.level = "debug";
logger.debug("Some debug messages");
输出结果:(运行 node app.js即可)
[2010-01-17 11:43:37.987] [DEBUG] [default] - Some debug messages
logger有以下几个level,优先级从下往上:
logger.trace("Entering cheese testing");
logger.debug("Got cheese.");
logger.info("Cheese is Comté.");
logger.warn("Cheese is quite smelly.");
logger.error("Cheese is too ripe!");
logger.fatal("Cheese was breeding ground for listeria.");
const log4js = require("log4js");
log4js.configure({
appenders: { cheese: { type: "file", filename: "cheese.log" } },
categories: { default: { appenders: ["cheese"], level: "error" } }
});
const logger = log4js.getLogger("cheese");
logger.trace("Entering cheese testing");
logger.debug("Got cheese.");
logger.info("Cheese is Comté.");
logger.warn("Cheese is quite smelly.");
logger.error("Cheese is too ripe!");
logger.fatal("Cheese was breeding ground for listeria.");
输出结果:
[2010-01-17 11:43:37.987] [ERROR] cheese - Cheese is too ripe!
[2010-01-17 11:43:37.990] [FATAL] cheese - Cheese was breeding ground for listeria.
configure是配置项
appenders是追加器。此处声明了追加器的名字是cheese,类型是文件,文件名是cheese.log;当然了你也可以自己手动设置多个追加器。
categories说明哪些追加器可以输出。此处声明了默认追加器是cheese,级别是error,因此输出从error级别往下,输出了error和fatal。
详情请见log4js文档
二、log4js的封装
1.创建封装文件
在项目根目录中创建utils目录,在utils下创建log4j.js文件。 封装代码如下:
// 日志存储
// @author wmh
const log4js = require('log4js')
const levels = {
'trace':log4js.levels.TRACE,//固定常量
'debug':log4js.levels.DEBUG,
'info':log4js.levels.INFO,
'warn':log4js.levels.WARN,
'error':log4js.levels.ERROR,
'fatal':log4js.levels.FATAL,
}
log4js.configure({
//设置追加器
appenders:{
console:{ type:'console' },//追加器1
info:{//追加器2
type: 'file',
filename: 'logs/all-logs.log'
},
error:{//追加器3
type: 'dateFile',
filename:'logs/log',
pattern:'yyyy-MM-dd.log',
alwaysIncludePattern:true// 设置文件名称为 filename + pattern
}
},
//指定哪些追加器可以输出来
categories:{
default:{ appenders: [ 'console' ], level: 'debug' },
info:{
appenders: [ 'info','console' ],
level: 'info'
},
error:{
appenders: ['error','console' ],
level: 'error'
}
}
})
/**
* 日志输出,level为debug
* @param {string} content
*/
exports.debug = (content)=>{
let logger = log4js.getLogger();
logger.level = levels.debug;
logger.debug(content);
}
/**
* 日志输出,level为info
* @param {string} content
*/
exports.info = (content)=>{
let logger = log4js.getLogger('info');
logger.level = levels.info;
logger.info(content);
}
/**
* 日志输出,level为error
* @param {string} content
*/
exports.error = (content)=>{
let logger = log4js.getLogger('error');
logger.level = levels.error;
logger.error(content);
}
2.在app.js中引入并测试
代码如下:
const log4js = require('./utils/log4j')
log4js.info('log output')//info
//error
app.use(()=>{
ctx.body = 'help'
})
app.on('error', (err, ctx) => {
log4js.error(`${err.stack}`)
});
输出如下: