前言
当项目上线后,依旧会遇到不符合预期的情况,这种情况下,一个适当的记录是非常重要的(同时,不具备的日志记录环节的系统是万万不可被投入生产的)
log4js-node是一款比较优秀的node日志存储框架,在开发java的过程中曾使用过log4j,尽管二者非常名字非常相似,但二者不是一样的,
当然,他们功能都非常强大:
- 彩色控制台记录到stdout或stderr
- 文件附加器,根据文件大小或日期可配置日志滚动
- 连接器/快速服务器的记录器
- 可配置的日志消息布局/模式
- 不同日志类别的不同日志级别(将应用程序日志的某些部分设置为DEBUG,其他部分仅设置为ERRORS等)
不仅仅如此,它还具备:
- SMTP
- GELF
- Loggly
- Logstash (UDP and HTTP)
- logFaces (UDP and HTTP)
- RabbitMQ
- Redis
- Hipchat
- Slack
- mailgun
- InfluxDB
设计思路
从某种角度来说,log4js开箱即用,我们只需要做好配置即可,所以这里做一层封装
首先准备配置文件(这里建议查看github文档或者查看源码去理解配置)
源码中配置文件的说明 TS
export interface Configuration {
appenders: { [name: string]: Appender; };
categories: { [name: string]: { appenders: string[]; level: string; enableCallStack?: boolean; } };
pm2?: boolean;
pm2InstanceVar?: string;
levels?: Levels;
disableClustering?: boolean;
}
编码
实现的配置文件 (这里使用日志文件取记录)
/**
* log4j
*/
log4j: {
//log4j配置项
configuration: {
//
replaceConsole: true,
//开启pm2
pm2: true,
appenders: {
//控制台输出
stdout: {
type: 'console'
},
trace: {
type: 'dateFile',
filename: '../logs/app/trace/',
pattern: 'yyyy-MM-dd.log',
//每个日志的最大存储空间
// maxLogSize: 10,
//包含模型
alwaysIncludePattern: true
},
debug: {
type: 'dateFile',
filename: '../logs/app/debug/',
pattern: 'yyyy-MM-dd.log',
// maxLogSize: 10,
alwaysIncludePattern: true
},
info: {
type: 'dateFile',
filename: '../logs/app/info/',
pattern: 'yyyy-MM-dd.log',
// maxLogSize: 10,
alwaysIncludePattern: true
},
warn: {
type: 'dateFile',
filename: '../logs/app/warn/',
pattern: 'yyyy-MM-dd.log',
// maxLogSize: 10,
alwaysIncludePattern: true
},
error: {
type: 'dateFile',
filename: '../logs/app/error/',
pattern: 'yyyy-MM-dd.log',
// maxLogSize: 10,
alwaysIncludePattern: true
},
fatal: {
type: 'dateFile',
filename: '../logs/app/fatal/',
pattern: 'yyyy-MM-dd.log',
// maxLogSize: 10,
alwaysIncludePattern: true
},
},
categories: {
//appenders:采用的appender,取appenders项,level:设置级别
trace: {appenders: ['stdout', 'trace'], level: 'trace'},
debug: { appenders: ['stdout', 'debug'], level: 'debug' },
default: {appenders: ['stdout', 'info'], level: 'info'},
warn: {appenders: ['stdout', 'warn'], level: 'warn'},
error: {appenders: ['stdout', 'error'], level: 'error'},
fatal: {appenders: ['stdout', 'fatal'], level: 'fatal'},
}
},
//日志输出级别
levels: ['INFO','WARN','DEBUG'],
//自定义格式化输出项
format: '[:remote-addr :method :url :status :response-time ms][:referrer HTTP/:http-version :user-agent]'
}
接着封装 LoggerFactory
const log4js = require('log4js');
/**
* @author yichengxian
* log4j 日志处理
* how to use:</br>
* // 获得lo记录gger对象 注意使用的是哪个 categories
* const logger = LoggerFactory.getLogger('info');
*
* logger.debug('%s','debug日志');
* logger.info('%s','info日志');
* logger.error('%s','error日志');
* //以上都会打入info categories 文件中
*
*/
class LoggerFactory {
/**
* 配置log4j
* @param configuration {Configuration}
*/
static configure(configuration) {
log4js.configure(configuration)
}
/**
* app use this
* @param app
* @param name 参照getLogger 方法
* @param format 格式化输出 可不填
*/
static useLogger(app, name, format) {
let options = {};
if (undefined !== format) {
options.format = format;
}
app.use(log4js.connectLogger(this.getLogger(name),options));
}
/**
* @param name 取categories项 可不填为默认的info
* @return {Logger}
*/
static getLogger(name) {
const logger = log4js.getLogger(name || 'info');
return logger;
}
}
module.exports = LoggerFactory
配置express的使用:
#先加载配置文件
loggerFactory.configure(config.log4j.configuration);
#use express app (中间件逻辑)
loggerFactory.useLogger(app)
结语
日志记录的良好使用可以使用户快速定位到异常情况以及具体位置,将会解决燃眉之急。
水啊,log4js的设计惟妙惟肖,简单且又实用,简单的记录