node 日誌管理log4js
一、預設的控制檯輸出
我們使用express框架時,開發模式用node或者supervisor啟動nodejs應用時,控制檯都是顯示如下的日誌。
GET /css/bootstrap.min.css 304 1ms GET /css/my.css 304 0ms GET /js/bootstrap.min.js 304 4ms GET /js/jquery-1.9.1.min.js 304 6ms GET /js/holder.js 304 3ms GET /cat/json/latest 200 6ms GET /cat/json/master 200 4ms GET /cat/json/classic 200 2ms GET /about 200 6ms GET /css/bootstrap.min.css 304 2ms GET /css/my.css 304 2ms GET /js/bootstrap.min.js 304 2ms GET /js/jquery-1.9.1.min.js 304 1ms GET /js/holder.js 304 1ms GET /js/bootstrap.min.js 304 1ms GET / 304 6ms GET /js/jquery-1.9.1.min.js 304 2ms GET /css/my.css 304 1ms GET /css/bootstrap.min.css 304 1ms GET /js/bootstrap.min.js 304 2ms GET /js/holder.js 304 2ms GET /cat/json/latest 200 3ms GET /cat/json/master 200 2ms GET /cat/json/classic 200 2ms GET /admin/ 304 13ms GET /css/bootstrap.min.css 304 3ms GET /js/jquery-1.9.1.min.js 304 2ms GET /css/my.css 304 2ms GET /js/bootstrap.min.js 304 1ms GET /js/holder.js 304 2ms
我們也可以在程式碼中,用console.log()列印一些控制檯日誌。
修改routes/index.js
exports.index = function(req, res){
console.log("This is an index page!");
res.render('index', {
title:'首頁|moive.me',
page:'index'
});
};
訪問頁面,結果如下:
This is an index page! GET / 304 19ms GET /css/bootstrap.min.css 304 4ms GET /css/my.css 304 2ms GET /js/jquery-1.9.1.min.js 304 38ms GET /js/holder.js 304 29ms GET /js/bootstrap.min.js 304 28ms
這樣的輸出的結果,都是在控制檯顯示,一旦server重啟日誌就丟失了。對於程式開發來說,這樣的輸出已經夠用了。但是在生產環境上,我們希望能把控制檯的輸出,儲存到檔案中,而且需要更多的資訊,不僅僅是預設的簡化的日誌資訊。
由於express框架沒有日誌功能,我們需要引入log4js包來完成這個功能。
二、配置log4js與express框架整合
1、安裝
npm install log4js
2、修改專案入口配置檔案,如日誌分析專案express.js
var log4js = require('log4js'); log4js.configure({ appenders: [ { type: 'console' }, //控制檯輸出 { type: 'file', //檔案輸出 filename: 'logs/log.log', maxLogSize: 1024, backups:3, category: 'normal' } ] }); var logger = log4js.getLogger('normal'); logger.setLevel('INFO'); ... app.use(log4js.connectLogger(logger, {level:log4js.levels.INFO})); app.use(app.router);
需要在express.js中進行log4js的配置。 appenders中配置了兩個輸出,一個是控制檯輸出,一個是檔案輸出。
appenders.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(),那麼上線的時候,改動這個東西就要花很多時間。
三、根據專案配置log4js
-
增加replaceConsole代替console.log() 增加replaceConsole配置,讓所有console輸出到日誌中,以[INFO] console代替console預設樣式。
var log4js = require('log4js'); log4js.configure({ appenders: [ { type: 'console' },{ type: 'file', filename: 'logs/log.log', maxLogSize: 1024, backups:4, category: 'normal' } ], replaceConsole: true });
-
調整日誌輸出的格式
app.use(log4js.connectLogger(logger, {level: level:log4js.levels.INFO, format:':method :url'}));
-
自動調整日誌輸出級別
設定level為auto:日誌級別對應規則: http responses 3xx, level = WARN http responses 4xx & 5xx, level = ERROR else, level = INFO
app.use(log4js.connectLogger(logger, {level: 'auto', format:':method :url'}));
四、調整log4js結構
我們在配置log4js時會有一個問題。就是以上所有配置資訊都是在express.js中做的,logger也是在這裡直接定義的。如果在控制器(routes)想用log4js進行輸出,我們現在拿不到logger的控制代碼。
新建立log.js
var log4js = require('log4js'); log4js.configure({ appenders: [ { type: 'console', category: "console" }, //控制檯輸出 { type: "file", filename: 'logs/log.log', pattern: "_yyyy-MM-dd", maxLogSize: 20480, backups: 3, category: 'dateFileLog' }//日期檔案格式 ], replaceConsole: true, //替換console.log levels:{ dateFileLog: 'debug', console: 'debug' } }); var dateFileLog = log4js.getLogger('dateFileLog'); var consoleLog = log4js.getLogger('console'); exports.logger = consoleLog; exports.use = function(app) { app.use(log4js.connectLogger(consoleLog, {level:'INFO', format:':method :url'})); }
我們把logger單獨定義出來,並且做為API暴露出來,此處是開發除錯,沒有使用檔案輸出。 這樣在其他模組中使用logger輸出日誌只需如下操作:
樣我們就已經玩轉log4js了,如果部署生產需要檔案輸出只要修改log.js中dateFileLog級別,然後設定exports.logger=dateFileLog即可。var logger = require('../../log').logger; logger.debug("collectTime=%s",collectTime);