Log4js 是 Node.js 中一个成熟的记录日志的第三方模块,本篇主要汇总一些关于log4js的详细用法,包括常用的配置项和基础的api使用。以及在koa2中绑定上下文对象的集成用法。
npm i log4js -S
// 或者
npm istall log4js -save
简单使用
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.level = 'debug';
logger.debug("Some debug messages");
var log4js = require('log4js');
// log4js的输出级别6个: trace, debug, info, warn, error, fatal
log4js.configure({
//输出位置的基本信息设置
appenders: {
//设置控制台输出 (默认日志级别是关闭的(即不会输出日志))
out: { type: 'console' },
//设置每天:以日期为单位,数据文件类型,dataFiel 注意设置pattern,alwaysIncludePattern属性
alldateFileLog: { type: 'dateFile', filename: './log/all', pattern: '-yyyy-MM-dd.log', alwaysIncludePattern: true },
//所有日志记录,文件类型file 文件最大值maxLogSize 单位byte (B->KB->M) backups:备份的文件个数最大值,最新数据覆盖旧数据
allfileLog: { type: 'file', filename: './log/all.log', keepFileExt: true, maxLogSize: 1024*1024*100, backups: 3 },
httpLog: { type: "dateFile", filename: "log/httpAccess.log", pattern: ".yyyy-MM-dd", keepFileExt: true},
//错误日志 type:过滤类型logLevelFilter,将过滤error日志写进指定文件
errorLog: { type: 'file', filename: './log/error.log' },
error: { type: "logLevelFilter", level: "error", appender: 'errorLog' }
},
//不同等级的日志追加到不同的输出位置:appenders: ['out', 'allLog'] categories 作为getLogger方法的键名对应
categories: {
//appenders:采用的appender,取上面appenders项,level:设置级别
http: { appenders: ['out', 'httpLog'], level: "debug" },
default: { appenders: ['out', 'allfileLog'], level: 'debug' }, //error写入时是经过筛选后留下的
}
});
// 使用示例
//如果 log4js.getLogger 中没有指定,默认为default日志的配置项
const logger = log4js.getLogger();
const logger = log4js.getLogger('http');
logger.trace('trace testting');
logger.debug('trace testting');
logger.info('trace testting');
logger.warn('trace testting');
logger.error('trace testting');
logger.fatal('trace testting');
在middleware/midlog/logger.js脚本中封装一个记录响应时间的中间件
const log4js = require('log4js');
module.exports = ( options ) => {
return async (ctx, next) => {
const start = Date.now()
log4js.configure({
appenders: { koa2learn: { type: 'file', filename: './log/koa2learn.log' } },
categories: { default: { appenders: ['koa2learn'], level: 'info' } }
});
const logger = log4js.getLogger('koa2learn');
await next()
const end = Date.now()
const responseTime = end - start;
logger.info(`响应时间为${responseTime/1000}s`);
}
}
在入口函数中,使用该中间件
// 引入日志中间件
const miLog = require('./midlog/logger')
const Koa = require('koa')
const app = new Koa()
// 注册中间件
app.use(miLog())
将log4js对象绑定到context上下文中可以更方便的调取日志对象和写入日志。
const log4js = require('log4js');
const methods = ["trace", "debug", "info", "warn", "error", "fatal", "mark"]
module.exports = () => {
return async (ctx, next) => {
const contextLogger = {}
const start = Date.now()
log4js.configure({
appenders: {
koa2learn: {
type: 'dateFile', // 日志类型
filename: `./logs/koa2learn`, // 输出的文件名
pattern: 'yyyy-MM-dd.log', // 文件名增加后缀
alwaysIncludePattern: true // 是否总是有后缀名
}
},
categories: {
default: {
appenders: ['koa2learn'],
level: 'info'
}
}
});
const logger = log4js.getLogger('koa2learn');
// 循环methods将所有方法挂载到ctx 上
methods.forEach((method, i) => {
contextLogger[method] = (message) => {
logger[method](message)
}
})
ctx.log = contextLogger;
await next();
const responseTime = Date.now() - start;
logger.info(`响应时间为${responseTime/1000}s`);
}
}