[完整]Nodejs日志管理log4js

从零开始nodejs系列文章

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

前言

日志对任何的应用来说都是至关重要的。在Nodejs中使用express框架并没有自带的日志模块,我们可以选择log4js来完成日志记录的功能。

如果用过JAVA中log4j的同学,肯定对日志并不陌生,学习log4js会更得心应手的。

文章目录:

  1. 默认的控制台输出
  2. 通过log4js输出日志
  3. 配置log4js与express框架集成
  4. 根据项目配置log4js
  5. 优化log4js结构

1. 默认的控制台输出

let logger = require('morgan');
// 加载日志中间件。
app.use(logger('dev'));

我们使用express框架时,开发模式用node或者supervisor启动nodejs应用时,控制台都是显示如下的日志。

GET / 200 28.106 ms - 12104
GET /font-awesome-4.7.0/css/font-awesome.css 200 6.413 ms - 37414
GET /css/common.css 200 7.513 ms - 9296
GET /lib/sweetalert.min.js 200 7.250 ms - 40802
GET /bootstrap-3.3.7-dist/js/bootstrap.js 200 7.322 ms - 69707
GET /bootstrap-3.3.7-dist/css/bootstrap.css 200 7.280 ms - 146010
GET /lib/jquery-3.1.0.min.js 200 7.383 ms - 86351
GET /lib/template-web.js 200 3.695 ms - 16504
GET /js/common.js 200 1.841 ms - 5263

我们也可以在代码中,用console.log()打印一些控制台日志。

修改routes/index.js

module.exports = function (app) {

    app.get('/', function (req, res) {
        let userInfo = sessionConfig.getUser(req, res);
        console.log('i am the index page!!')
        res.render('index', {title: '首页', user: userInfo ? userInfo : {}});
    });

}

访问页面,结果如下。

i am the index page!!
GET / 200 24.365 ms - 12104
GET /font-awesome-4.7.0/css/font-awesome.css 200 6.924 ms - 37414
GET /css/common.css 200 5.535 ms - 9296
GET /lib/sweetalert.min.js 200 6.105 ms - 40802
GET /lib/jquery-3.1.0.min.js 200 6.267 ms - 86351
GET /bootstrap-3.3.7-dist/js/bootstrap.js 200 6.173 ms - 69707
GET /bootstrap-3.3.7-dist/css/bootstrap.css 200 6.982 ms - 146010
GET /js/common.js 200 5.989 ms - 5263

这样的输出的结果,都是在控制台显示,一旦server重启日志就丢失了。对于程序开发来说,这样的输出已经够用了。但是在生产环境上,我们希望能把控制台的输出,保存到文件中,而且需要更多的信息,不仅仅是默认的简化的日志信息。

由于express框架没有日志功能,我们需要引入log4js包来完成这个功能。

2. 通过log4js输出日志

我们先可看一下,通过log4js输出的日志是什么样子的,下一节再介绍具体的配置。

i am the index page!!
[2018-10-25T10:56:22.545] [INFO] normal - ::1 - - "GET / HTTP/1.1" 200 12104 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
[2018-10-25T10:56:22.581] [INFO] normal - ::1 - - "GET /font-awesome-4.7.0/css/font-awesome.css HTTP/1.1" 200 37414 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
[2018-10-25T10:56:22.586] [INFO] normal - ::1 - - "GET /bootstrap-3.3.7-dist/css/bootstrap.css HTTP/1.1" 200 146010 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
[2018-10-25T10:56:22.587] [INFO] normal - ::1 - - "GET /css/common.css HTTP/1.1" 200 9296 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
[2018-10-25T10:56:22.588] [INFO] normal - ::1 - - "GET /lib/sweetalert.min.js HTTP/1.1" 200 40802 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
[2018-10-25T10:56:22.590] [INFO] normal - ::1 - - "GET /bootstrap-3.3.7-dist/js/bootstrap.js HTTP/1.1" 200 69707 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"

相同的请求,控制台输出的结果多了很多,完整的web服务器的日志格式。
这才是生产环境需要的!信息更丰富,并且与nginx和apache是一样的格式。

3. 配置log4js与express框架集成

下载log4js包


~ npm install log4js
[email protected] node_modules\log4js
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected]

Appenders将日志事件序列化为某种形式的输出。他们可以写入文件,发送电子邮件,通过网络发送数据。所有appender都有一个类型,用于确定使用哪个appender。例如:

修改app.js

//错误日志包
let log4js = require('log4js');
log4js.configure({
    appenders: {
        out: { type: 'console' },
        app: { type: 'file', filename: 'application.log' }
    },
    categories: {
        default: { appenders: [ 'out', 'app' ], level: 'info' }
    }
});
let logger = log4js.getLogger('normal');
app.use(log4js.connectLogger(logger, {level: log4js.levels.INFO}));

这定义了两个名为'out'和'app'的appender。 'out'使用stdout appender写入标准输出。 'app'使用文件appender,配置为写入'application.log'。

type=file的对象,指定文件输出位置及文件大小,当超过maxLogSize大小时,会自动生成一个新文件。logs的文件目录要动手创建。
level:log4js.levels.INFO, 设置默认日志输出级别是INFO。

log4js的输出级别6个: trace, debug, info, warn, error, fatal

  • logger.trace(‘Entering cheese testing’);
  • logger.debug(‘Got cheese.’);
  • logger.info(‘Cheese is Gouda.’);
  • logger.warn(‘Cheese is quite smelly.’);
  • logger.error(‘Cheese is too ripe!’);
  • logger.fatal(‘Cheese was breeding ground for listeria.’);

如果输出级别是INFO,则不会打印出低于info级别的日志trace,debug,只打印info,warn,error,fatal。这样做的好处在于,在生产环境中我们可能只关心异常和错误,并不关心调试信息。从而大大减少日志的输出,能减少磁盘写入。而在开发环境中,我们可以需要打印非常多的信息,帮助开发人员定位错误,调试代码。

还有一个好处就是,代码中可以混有各种的日志打印代码。我们只要在一个配置文件中,修改输出级别,日志输出就会发生变化,不用修改所有的代码。如果所有地方都是console.log(),那么上线的时候,改动这个东西就要花很多时间。

4. 优化输出log4js结构

在配置中添加输出格式化:format:':method :url'

let logger = log4js.getLogger('normal');
app.use(log4js.connectLogger(logger, {level: log4js.levels.INFO, format:':method :url'}));
i am the index page!!
[2018-10-25T11:04:25.312] [INFO] normal - GET /
[2018-10-25T11:04:25.341] [INFO] normal - GET /font-awesome-4.7.0/css/font-awesome.css
[2018-10-25T11:04:25.350] [INFO] normal - GET /bootstrap-3.3.7-dist/css/bootstrap.css
[2018-10-25T11:04:25.350] [INFO] normal - GET /css/common.css
[2018-10-25T11:04:25.352] [INFO] normal - GET /lib/sweetalert.min.js
[2018-10-25T11:04:25.356] [INFO] normal - GET /bootstrap-3.3.7-dist/js/bootstrap.js
[2018-10-25T11:04:25.360] [INFO] normal - GET /lib/jquery-3.1.0.min.js
[2018-10-25T11:04:25.362] [INFO] normal - GET /lib/template-web.js
[2018-10-25T11:04:25.365] [INFO] normal - GET /js/common.js

 

5. 优化log4js结构

应该有同学发现了,我们在配置log4js时会有一个问题。就是所有配置信息都是在app.js中做的,logger也是在这里直接定义的。如果在控制器(routes)想用log4js进行输出,我们现在拿不到logger的句柄。

修改app.js,

//日志包配置
let log4js = require('log4js');
log4js.configure({
    appenders: {
        out: { type: 'console' },
        app: { type: 'file', filename: 'application.log' }
    },
    categories: {
        default: { appenders: [ 'out', 'app' ], level: 'info' }
    }
});
let logger = log4js.getLogger('normal');
app.use(log4js.connectLogger(logger, {level: log4js.levels.INFO, format:':method :url'}));

exports.logger=function(name){
  var logger = log4js.getLogger(name);
  logger.setLevel('INFO');
  return logger;
}

我们把logger单独定义出来,并且做为API暴露出来。

在index.js中使用logger输出

~ vi routes/index.js
var logger = require('../app').logger('index');
exports.index = function(req, res){
	console.log("This is an index page!");
	logger.info("This is an index page! -- log4js");

	res.render('index', {
  		title:'首页|moive.me',
  		page:'index'
  	});
};

打印出来结果

[2013-06-19 18:56:51.924] [INFO] console - This is an index page!
[2013-06-19 18:56:51.925] [INFO] index - This is an index page! -- log4js
GET / 304 17ms
[2013-06-19 18:56:51.938] [WARN] [default] - GET /
GET /css/bootstrap.min.css 304 5ms
[2013-06-19 18:56:51.978] [WARN] [default] - GET /css/bootstrap.min.css
GET /css/my.css 304 2ms
[2013-06-19 18:56:51.981] [WARN] [default] - GET /css/my.css
GET /js/jquery-1.9.1.min.js 304 2ms
[2013-06-19 18:56:51.984] [WARN] [default] - GET /js/jquery-1.9.1.min.js
GET /js/holder.js 304 3ms
[2013-06-19 18:56:51.989] [WARN] [default] - GET /js/holder.js
GET /js/bootstrap.min.js 304 9ms
[2013-06-19 18:56:52.002] [WARN] [default] - GET /js/bootstrap.min.js

这样我们就已经玩转log4js了,为部署到生产环境,做好了日志的准备工作。

来自:http://blog.fens.me/nodejs-log4js/

猜你喜欢

转载自blog.csdn.net/github_37360787/article/details/83375589
今日推荐