Node.js 日志處理模塊log4js
log4js 是 Node.js 日志處理中的數(shù)一數(shù)二的模塊。比起 console 或者 TJ 的 debug 有其優(yōu)勢,尤其針對投入生產(chǎn)的 Node.js 項目來說下面這些是不可少的:
- 日志分級
- 日志分類
- 日志落盤
本文將會給你一個 log4js 的全面介紹,讓你可以在項目中駕輕就熟的使用 log4js,開發(fā)調(diào)試容易,線上更好地監(jiān)控或排查問題。
牛刀小試
下面這三行代碼為你展示了 log4js 最簡單的用法:
// file: simplest.js var log4js = require('log4js'); var logger = log4js.getLogger(); logger.debug("Time:", new Date());
調(diào)用 .getLogger() 可以獲得 log4js 的 Logger 實例,這個實例的用法與 console 是一致的,可以調(diào)用 .debug (也有 .info 、 .error 等方法)來輸出日志。
運行 node simplest.js ,輸出如下:
$node simplest.js [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z
Time: 2016-08-20T16:01:24.852Z 是我們想要輸出的內(nèi)容,前面的包含說明符 [2016-08-21 00:01:24.852] [DEBUG] [default] 后文再表。
使用起來是不是也很簡單,好了,在我們深入到 log4js 高級用法之前,我們先來熟悉一下幾個 log4js 中的概念。
Level
這個理解起來不難,就是日志的分級。日志有了分級,log4js 才能更好地為我們展示日志(不同級別的日志在控制臺中采用不同的顏色,比如 error 通常是紅色的),在生產(chǎn)可以有選擇的落盤日志,比如避免一些屬于 .debug 才用的敏感信息被泄露出來。
log4js 的日志分為九個等級,各個級別的名字和權(quán)重如下:
{ ALL: new Level(Number.MIN_VALUE, "ALL"), TRACE: new Level(5000, "TRACE"), DEBUG: new Level(10000, "DEBUG"), INFO: new Level(20000, "INFO"), WARN: new Level(30000, "WARN"), ERROR: new Level(40000, "ERROR"), FATAL: new Level(50000, "FATAL"), MARK: new Level(9007199254740992, "MARK"), // 2^53 OFF: new Level(Number.MAX_VALUE, "OFF") }
上個圖:
ALL OFF 這兩個等級并不會直接在業(yè)務(wù)代碼中使用。剩下的七個即分別對應 Logger 實例的七個方法, .trace .debug .info ... 。也就是說,你在調(diào)用這些方法的時候,就相當于為這些日志定了級。因此,之前的 [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z 中的 DEBUG 既是這條日志的級別。
類型
log4js 還有一個概念就是 category(類型),你可以設(shè)置一個 Logger 實例的類型,按照另外一個維度來區(qū)分日志:
// file: set-catetory.js var log4js = require('log4js'); var logger = log4js.getLogger('example'); logger.debug("Time:", new Date());
在通過 getLogger 獲取 Logger 實例時,唯一可以傳的一個參數(shù)就是 loggerCategory(如 'example' ),通過這個參數(shù)來指定 Logger 實例屬于哪個類別。這與 TJ 的 debug 是一樣的:
var debug = require('debug')('worker'); setInterval(function(){ debug('doing some work'); }, 1000);
在 debug 中 'worker' ,同樣也是為日志分類。好了,回來運行 node set-catetory.js :
[2016-08-21 01:16:00.212] [DEBUG] example - Time: 2016-08-20T17:16:00.212Z
與之前的 [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z 唯一不同的地方就在于, [default] 變成了 example 。
那類別有什么用呢,它比級別更為靈活,為日志了提供了第二個區(qū)分的維度,例如,你可以為每個文件設(shè)置不同的 category,比如在 set-catetory.js 中:
// file: set-catetory.js var log4js = require('log4js'); var logger = log4js.getLogger('set-catetory.js'); logger.debug("Time:", new Date());
就可以從日志 [2016-08-21 01:24:07.332] [DEBUG] set-catetory.js - Time: 2016-08-20T17:24:07.331Z 看出,這條日志來自于 set-catetory.js 文件。又或者針對不同的 node package 使用不同的 category,這樣可以區(qū)分日志來源于哪個模塊。
Appender
好了,現(xiàn)在日志有了級別和類別,解決了日志在入口處定級和分類問題,而在 log4js 中,日志的出口問題(即日志輸出到哪里)就由 Appender 來解決。
默認 appender
下面是 log4js 內(nèi)部默認的 appender 設(shè)置:
// log4js.js defaultConfig = { appenders: [{ type: "console" }] }
可以看到,在沒有對 log4js 進行任何配置的時候,默認將日志都輸出到了控制臺。
設(shè)置自己的 appender
我們可以通過 log4js.configure 來設(shè)置我們想要的 appender。
// file: custom-appender.js var log4js = require('log4js'); log4js.configure({ appenders: [{ type: 'file', filename: 'default.log' }] }) var logger = log4js.getLogger('custom-appender'); logger.debug("Time:", new Date());
在上例中,我們將日志輸出到了文件中,運行代碼,log4js 在當前目錄創(chuàng)建了一個名為 default.log 文件, [2016-08-21 08:43:21.272] [DEBUG] custom-appender - Time: 2016-08-21T00:43:21.272Z 輸出到了該文件中。
log4js 提供的 appender
Console 和 File 都是 log4js 提供的 appender,除此之外還有:
DateFile:日志輸出到文件,日志文件可以安特定的日期模式滾動,例如今天輸出到 default-2016-08-21.log ,明天輸出到 default-2016-08-22.log ;
SMTP:輸出日志到郵件;
Mailgun:通過 Mailgun API 輸出日志到 Mailgun;
levelFilter 可以通過 level 過濾;
等等其他一些 appender,到 這里 可以看到全部的列表。
過濾級別和類別
我們可以調(diào)整 appender 的配置,對日志的級別和類別進行過濾:
// file: level-and-category.js var log4js = require('log4js'); log4js.configure({ appenders: [{ type: 'logLevelFilter', level: 'DEBUG', category: 'category1', appender: { type: 'file', filename: 'default.log' } }] }) var logger1 = log4js.getLogger('category1'); var logger2 = log4js.getLogger('category2'); logger1.debug("Time:", new Date()); logger1.trace("Time:", new Date()); logger2.debug("Time:", new Date());
運行,在 default.log 中增加了一條日志:
[2016-08-21 10:08:21.630] [DEBUG] category1 - Time: 2016-08-21T02:08:21.629Z
來看一下代碼:
使用 logLevelFilter 和 level 來對日志的級別進行過濾,所有權(quán)重大于或者等于 DEBUG 的日志將會輸出。這也是之前提到的日志級別權(quán)重的意義;
通過 category 來選擇要輸出日志的類別, category2 下面的日志被過濾掉了,該配置也接受一個數(shù)組,例如 ['category1', 'category2'] ,這樣配置兩個類別的日志都將輸出到文件中。
Layout
Layout 是 log4js 提供的高級功能,通過 layout 我們可以自定義每一條輸出日志的格式。log4js 內(nèi)置了四中類型的格式:
messagePassThrough:僅僅輸出日志的內(nèi)容;
basic:在日志的內(nèi)容前面會加上時間、日志的級別和類別,通常日志的默認 layout;
colored/coloured:在 basic 的基礎(chǔ)上給日志加上顏色,appender Console 默認使用的就是這個 layout;
pattern:這是一種特殊類型,可以通過它來定義任何你想要的格式。
一個 pattern 的例子:
// file: layout-pattern.js var log4js = require('log4js'); log4js.configure({ appenders: [{ type: 'console', layout: { type: 'pattern', pattern: '[%r] [%[%5.5p%]] - %m%n' } }] }) var logger = log4js.getLogger('layout-pattern'); logger.debug("Time:", new Date());
%r %p $m $n 是 log4js 內(nèi)置的包含說明符,可以借此來輸出一些 meta 的信息,更多細節(jié),可以參考 log4js 的 文檔 。
一張圖再來說明一下,Logger、Appender 和 Layout 的定位。
實戰(zhàn):輸出 Node 應用的 ACCESS 日志 access.log
為了方便查問題,在生產(chǎn)環(huán)境中往往會記錄應用請求進出的日志。那使用 log4js 怎么實現(xiàn)呢,直接上代碼:
// file: server.js var log4js = require('log4js'); var express = require('express'); log4js.configure({ appenders: [{ type: 'DateFile', filename: 'access.log', pattern: '-yyyy-MM-dd.log', alwaysIncludePattern: true, category: 'access' }] }); var app = express(); app.use(log4js.connectLogger(log4js.getLogger('access'), { level: log4js.levels.INFO })); app.get('/', function(req,res) { res.send('前端外刊評論'); }); app.listen(5000);
看看我們做了哪些事情:
配置了一個 appender,從日志中選出類別為 access 的日志,輸出到一個滾動的文件中;
log4js.getLogger('access') 獲取一個類別為 access 的 Logger 實例,傳遞給 log4js.connectLogger 中間件,這個中間件收集訪問信息,通過這個實例打出。
啟動服務(wù)器,訪問 http://localhost:5000,你會發(fā)現(xiàn)目錄中多了一個名為 access.log-2016-08-21.log 的文件,里面有兩條日志:
[2016-08-21 14:34:04.752] [INFO] access - ::1 - - "GET / HTTP/1.1" 200 18 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
[2016-08-21 14:34:05.002] [INFO] access - ::1 - - "GET /favicon.ico HTTP/1.1" 404 24 "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
通過 log4js 日志的分類和appender功能,我們把訪問日志輸出到了一個滾動更新的文件之中。
總結(jié)
本文為大家全面地介紹了 log4js 的用法,與 console 或者簡單的日志工具相比,log4js 使用起來更復雜,當然功能更強大,適合生產(chǎn)級應用的使用。如果大家有興趣的話,請留言告訴外刊君,接下來可能為大家介紹如何在 Node 應用中做配置管理。
- nodejs 日志模塊winston的使用方法
- Nodejs Express 通過log4js寫日志到Logstash(ELK)
- 使用koa-log4管理nodeJs日志筆記的使用方法
- NodeJS讀取分析Nginx錯誤日志的方法
- Node.js中使用Log.io在瀏覽器中實時監(jiān)控日志(等同tail -f命令)
- Node.js利用console輸出日志文件的方法示例
- Node.js利用debug模塊打印出調(diào)試日志的方法
- Node.js和MongoDB實現(xiàn)簡單日志分析系統(tǒng)
- Node.js log4js日志管理詳解
- node錯誤處理與日志記錄的實現(xiàn)
- nodejs實現(xiàn)日志讀取、日志查找及日志刷新的方法分析
相關(guān)文章
Node.js開發(fā)之套接字(socket)編程入門示例
這篇文章主要介紹了Node.js開發(fā)之套接字(socket)編程,結(jié)合簡單實例形式分析了node.js套接字socket客戶端與服務(wù)器端相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下2019-11-11npm?install安裝報錯:gyp?info?it?worked?if?it?ends?with?
今天新啟動一個項目,在 npm install 安裝依賴項時出現(xiàn)報錯,所以下面這篇文章主要給大家介紹了關(guān)于npm?install安裝報錯:gyp?info?it?worked?if?it?ends?with?ok的解決方法,需要的朋友可以參考下2022-07-07node微信開發(fā)之獲取access_token+自定義菜單
這篇文章主要介紹了node微信開發(fā)之獲取access_token+自定義菜單,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03json對象及數(shù)組鍵值的深度大小寫轉(zhuǎn)換問題詳解
這篇文章主要給大家介紹了關(guān)于json對象及數(shù)組鍵值的深度大小寫轉(zhuǎn)換問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03