最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js 日志處理模塊log4js

 更新時(shí)間:2016年08月28日 15:46:53   投稿:hebedich  
今天和大家分享一下NodeJS中寫日志的一個(gè)常用第三方包:Log4js.下面我們就來(lái)詳細(xì)探討下吧

log4js 是 Node.js 日志處理中的數(shù)一數(shù)二的模塊。比起 console 或者 TJ 的 debug 有其優(yōu)勢(shì),尤其針對(duì)投入生產(chǎn)的 Node.js 項(xiàng)目來(lái)說(shuō)下面這些是不可少的:

  1. 日志分級(jí)
  2. 日志分類
  3. 日志落盤

本文將會(huì)給你一個(gè) log4js 的全面介紹,讓你可以在項(xiàng)目中駕輕就熟的使用 log4js,開(kāi)發(fā)調(diào)試容易,線上更好地監(jiān)控或排查問(wèn)題。

牛刀小試

下面這三行代碼為你展示了 log4js 最簡(jiǎn)單的用法:

// file: simplest.js
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Time:", new Date());

調(diào)用 .getLogger() 可以獲得 log4js 的 Logger 實(shí)例,這個(gè)實(shí)例的用法與 console 是一致的,可以調(diào)用 .debug (也有 .info 、 .error 等方法)來(lái)輸出日志。

運(yùn)行 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)容,前面的包含說(shuō)明符 [2016-08-21 00:01:24.852] [DEBUG] [default] 后文再表。

使用起來(lái)是不是也很簡(jiǎn)單,好了,在我們深入到 log4js 高級(jí)用法之前,我們先來(lái)熟悉一下幾個(gè) log4js 中的概念。

Level

這個(gè)理解起來(lái)不難,就是日志的分級(jí)。日志有了分級(jí),log4js 才能更好地為我們展示日志(不同級(jí)別的日志在控制臺(tái)中采用不同的顏色,比如 error 通常是紅色的),在生產(chǎn)可以有選擇的落盤日志,比如避免一些屬于 .debug 才用的敏感信息被泄露出來(lái)。

log4js 的日志分為九個(gè)等級(jí),各個(gè)級(jí)別的名字和權(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")
}

上個(gè)圖:

ALL OFF 這兩個(gè)等級(jí)并不會(huì)直接在業(yè)務(wù)代碼中使用。剩下的七個(gè)即分別對(duì)應(yīng) Logger 實(shí)例的七個(gè)方法, .trace .debug .info ... 。也就是說(shuō),你在調(diào)用這些方法的時(shí)候,就相當(dāng)于為這些日志定了級(jí)。因此,之前的 [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z 中的 DEBUG 既是這條日志的級(jí)別。

類型

log4js 還有一個(gè)概念就是 category(類型),你可以設(shè)置一個(gè) Logger 實(shí)例的類型,按照另外一個(gè)維度來(lái)區(qū)分日志:

// file: set-catetory.js
var log4js = require('log4js');
var logger = log4js.getLogger('example');
logger.debug("Time:", new Date());

在通過(guò) getLogger 獲取 Logger 實(shí)例時(shí),唯一可以傳的一個(gè)參數(shù)就是 loggerCategory(如 'example' ),通過(guò)這個(gè)參數(shù)來(lái)指定 Logger 實(shí)例屬于哪個(gè)類別。這與 TJ 的 debug 是一樣的:

var debug = require('debug')('worker');

setInterval(function(){
 debug('doing some work');
}, 1000);

在 debug 中 'worker' ,同樣也是為日志分類。好了,回來(lái)運(yùn)行 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 。

那類別有什么用呢,它比級(jí)別更為靈活,為日志了提供了第二個(gè)區(qū)分的維度,例如,你可以為每個(gè)文件設(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 看出,這條日志來(lái)自于 set-catetory.js 文件。又或者針對(duì)不同的 node package 使用不同的 category,這樣可以區(qū)分日志來(lái)源于哪個(gè)模塊。

Appender

好了,現(xiàn)在日志有了級(jí)別和類別,解決了日志在入口處定級(jí)和分類問(wèn)題,而在 log4js 中,日志的出口問(wèn)題(即日志輸出到哪里)就由 Appender 來(lái)解決。

默認(rèn) appender

下面是 log4js 內(nèi)部默認(rèn)的 appender 設(shè)置:

// log4js.js
defaultConfig = {
 appenders: [{
  type: "console"
 }]
}

可以看到,在沒(méi)有對(duì) log4js 進(jìn)行任何配置的時(shí)候,默認(rèn)將日志都輸出到了控制臺(tái)。

設(shè)置自己的 appender

我們可以通過(guò) log4js.configure 來(lái)設(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());

在上例中,我們將日志輸出到了文件中,運(yùn)行代碼,log4js 在當(dāng)前目錄創(chuàng)建了一個(gè)名為 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:日志輸出到文件,日志文件可以安特定的日期模式滾動(dòng),例如今天輸出到 default-2016-08-21.log ,明天輸出到 default-2016-08-22.log ;
SMTP:輸出日志到郵件;
Mailgun:通過(guò) Mailgun API 輸出日志到 Mailgun;
levelFilter 可以通過(guò) level 過(guò)濾;
等等其他一些 appender,到 這里 可以看到全部的列表。

過(guò)濾級(jí)別和類別

我們可以調(diào)整 appender 的配置,對(duì)日志的級(jí)別和類別進(jìn)行過(guò)濾:

// 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());

運(yùn)行,在 default.log 中增加了一條日志:

[2016-08-21 10:08:21.630] [DEBUG] category1 - Time: 2016-08-21T02:08:21.629Z
來(lái)看一下代碼:

使用 logLevelFilter 和 level 來(lái)對(duì)日志的級(jí)別進(jìn)行過(guò)濾,所有權(quán)重大于或者等于 DEBUG 的日志將會(huì)輸出。這也是之前提到的日志級(jí)別權(quán)重的意義;
通過(guò) category 來(lái)選擇要輸出日志的類別, category2 下面的日志被過(guò)濾掉了,該配置也接受一個(gè)數(shù)組,例如 ['category1', 'category2'] ,這樣配置兩個(gè)類別的日志都將輸出到文件中。

Layout

Layout 是 log4js 提供的高級(jí)功能,通過(guò) layout 我們可以自定義每一條輸出日志的格式。log4js 內(nèi)置了四中類型的格式:

messagePassThrough:僅僅輸出日志的內(nèi)容;
basic:在日志的內(nèi)容前面會(huì)加上時(shí)間、日志的級(jí)別和類別,通常日志的默認(rèn) layout;
colored/coloured:在 basic 的基礎(chǔ)上給日志加上顏色,appender Console 默認(rèn)使用的就是這個(gè) layout;
pattern:這是一種特殊類型,可以通過(guò)它來(lái)定義任何你想要的格式。
一個(gè) 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)置的包含說(shuō)明符,可以借此來(lái)輸出一些 meta 的信息,更多細(xì)節(jié),可以參考 log4js 的 文檔 。

一張圖再來(lái)說(shuō)明一下,Logger、Appender 和 Layout 的定位。

實(shí)戰(zhàn):輸出 Node 應(yīng)用的 ACCESS 日志 access.log

為了方便查問(wèn)題,在生產(chǎn)環(huán)境中往往會(huì)記錄應(yīng)用請(qǐng)求進(jìn)出的日志。那使用 log4js 怎么實(shí)現(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('前端外刊評(píng)論');
});
app.listen(5000);

看看我們做了哪些事情:

配置了一個(gè) appender,從日志中選出類別為 access 的日志,輸出到一個(gè)滾動(dòng)的文件中;
log4js.getLogger('access') 獲取一個(gè)類別為 access 的 Logger 實(shí)例,傳遞給 log4js.connectLogger 中間件,這個(gè)中間件收集訪問(wèn)信息,通過(guò)這個(gè)實(shí)例打出。
啟動(dòng)服務(wù)器,訪問(wèn) http://localhost:5000,你會(huì)發(fā)現(xiàn)目錄中多了一個(gè)名為 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"

通過(guò) log4js 日志的分類和appender功能,我們把訪問(wèn)日志輸出到了一個(gè)滾動(dòng)更新的文件之中。

總結(jié)

本文為大家全面地介紹了 log4js 的用法,與 console 或者簡(jiǎn)單的日志工具相比,log4js 使用起來(lái)更復(fù)雜,當(dāng)然功能更強(qiáng)大,適合生產(chǎn)級(jí)應(yīng)用的使用。如果大家有興趣的話,請(qǐng)留言告訴外刊君,接下來(lái)可能為大家介紹如何在 Node 應(yīng)用中做配置管理。

相關(guān)文章

  • Node.js中fs模塊的使用方法

    Node.js中fs模塊的使用方法

    這篇文章介紹了Node.js中fs模塊的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Node.js開(kāi)發(fā) path路徑模塊詳解

    Node.js開(kāi)發(fā) path路徑模塊詳解

    path 模塊是 Node.js 官方提供的、用來(lái)處理路徑的模塊,它提供了一系列的方法和屬性,用來(lái)滿足用戶對(duì)路徑的處理需求,這篇文章主要介紹了Node.js開(kāi)發(fā) path路徑模塊,需要的朋友可以參考下
    2024-02-02
  • nodejs構(gòu)建本地web測(cè)試服務(wù)器 如何解決訪問(wèn)靜態(tài)資源問(wèn)題

    nodejs構(gòu)建本地web測(cè)試服務(wù)器 如何解決訪問(wèn)靜態(tài)資源問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了nodejs構(gòu)建本地web測(cè)試服務(wù)器,教大家如何解決訪問(wèn)靜態(tài)資源問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Node.js多進(jìn)程的方法與參數(shù)實(shí)例說(shuō)明

    Node.js多進(jìn)程的方法與參數(shù)實(shí)例說(shuō)明

    這篇文章主要介紹了Node.js多進(jìn)程的方法與參數(shù)實(shí)例說(shuō)明,Node.js 是以單線程的模式運(yùn)行的,但它使用的是事件驅(qū)動(dòng)來(lái)處理并發(fā),這樣有助于我們?cè)诙嗪?nbsp;cpu 的系統(tǒng)上創(chuàng)建多個(gè)子進(jìn)程,從而提高性能,需要的朋友可以參考下
    2023-05-05
  • node+express制作爬蟲教程

    node+express制作爬蟲教程

    這篇文章主要介紹了node+express制作爬蟲的詳細(xì)過(guò)程和相關(guān)基礎(chǔ)知識(shí),非常的不錯(cuò),需要的朋友可以參考下
    2016-11-11
  • cnpm安裝詳細(xì)步驟(附圖文!)

    cnpm安裝詳細(xì)步驟(附圖文!)

    由于npm軟件包管理器有時(shí)可能不太穩(wěn)定,安裝依賴包容易報(bào)錯(cuò),所以就有了cnpm,這篇文章主要給大家介紹了關(guān)于cnpm安裝的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Node.js復(fù)制文件的方法示例

    Node.js復(fù)制文件的方法示例

    這篇文章主要介紹了Node.js復(fù)制文件的方法,涉及nodejs針對(duì)文件流的創(chuàng)建、讀取、寫入等操作技巧,需要的朋友可以參考下
    2016-12-12
  • Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn)

    Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn)

    這篇文章主要介紹了Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 在nodejs中創(chuàng)建child process的方法

    在nodejs中創(chuàng)建child process的方法

    這篇文章主要介紹了在nodejs中創(chuàng)建child process的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 帶你了解NodeJS事件循環(huán)

    帶你了解NodeJS事件循環(huán)

    這篇文章主要介紹NodeJS事件循環(huán),Node中代碼從上到下同步執(zhí)行,在執(zhí)行過(guò)程中會(huì)將不同的任務(wù)添加到相應(yīng)的隊(duì)列中,那具體有的循環(huán)又是怎么回事呢,限免現(xiàn)編就帶大家學(xué)習(xí)該詳細(xì)內(nèi)容,需要的朋友也可以參考一下
    2022-02-02

最新評(píng)論

曲阜市| 巴林右旗| 山西省| 武隆县| 新河县| 固原市| 本溪市| 玛沁县| 饶河县| 灵寿县| 子长县| 历史| 尼木县| 天津市| 天峻县| 泾阳县| 延川县| 南丰县| 松阳县| 垣曲县| 南丹县| 龙泉市| 晋中市| 儋州市| 喀喇沁旗| 贡嘎县| 新蔡县| 阜康市| 简阳市| 清丰县| 兴海县| 连州市| 和顺县| 汶川县| 巴里| 中牟县| 诏安县| 济南市| 沙湾县| 汉源县| 渭南市|