Nodejs log4js日志管理詳解

最近用到nodejs日志模塊--log4js,彌補(bǔ)一下之前大致使用的迷惑寝志。先看下圖總覽吗讶,接下來瑞眼,主要由淺入深的記錄log4js的常見配置谆级。

image.png

第一部分 入口【收集日志】

所謂的入口烤礁,其實(shí)就是所謂的收集日志信息讼积,如何有效、分門別類的收集所需信息脚仔,使我們記錄日志文件的第一步勤众,當(dāng)然,日志的作用就不在此啰嗦了鲤脏。
log4js提供了等級(jí)分類別名分類

配置

npm install log4js

1.1 等級(jí)分類

創(chuàng)建文件testLog4.js,

//testLog4.js
var log4js = require('log4js');
//logger 是log4js的實(shí)例
var logger = log4js.getLogger();
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');

結(jié)果為

image.png

類似于console實(shí)例中的log/error等们颜,這里先實(shí)例化log4js,采用不同的等級(jí)輸出不同的信息。等級(jí)有低到高顏色漸變猎醇。

image.png

以上圖片剽竊自Node.js 之 log4js 完全講解.

很直觀的將不同的等級(jí)的日志分類窥突。一方面方便了我們查看終端日志,另外之后在過濾中同樣可以起到作用硫嘶。

分等級(jí)不就是為了便于查找么阻问,第一種分類法到此結(jié)束。

1.2 類型分類

實(shí)例化log4js時(shí)指定一個(gè)別名沦疾,然后在日志中可以方便區(qū)分哪個(gè)文件等称近。

//testLog4.js
/*
  類型分類
 */
//實(shí)例化時(shí),唯一可以傳的一個(gè)參數(shù)category
var logger = log4js.getLogger('隨便起名字啦');
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');

如下圖

image.png

一圖勝前言哮塞,收集日志的方法都有了刨秆,具體的使用方法,后續(xù)羅列忆畅,緊接的任務(wù)就是如何保存衡未?

第二部分 出口【輸出日志】

2.1 Appender

剛我們只是初始化實(shí)例,以不同的類型家凯、等級(jí)輸出缓醋。默認(rèn)為console輸出,如何保存在文件中绊诲,就是appender上場(chǎng)了改衩。

image.png
2.1.1 file保存
//testLog4.js
log4js.configure({
  //是appenders,不是單數(shù)
  appenders:[{
      //以文件格式存儲(chǔ)
      type: 'file',
      //自動(dòng)創(chuàng)建123.log文件
      filename: '123.log'
    }]
})
var logger = log4js.getLogger('appenders');
logger.info('this no error');

結(jié)果保存在123.log中:

//123.log
[2017-09-23 16:01:59.940] [INFO] appenders - this no error
2.1.2 datefile保存

最簡單的日期保存例子驯镊,將日志保存在日志文件中,以天為單位竭鞍。

//testLog4.js
/*
  dateFile板惑,根據(jù)時(shí)間保存文件位置,文件自動(dòng)創(chuàng)建
 */
log4js.configure({
  appenders:[{
    type: 'dateFile',
    //文件名為= filename + pattern, 設(shè)置為alwaysIncludePattern:true
    filename: '234',
    pattern: '-yyyy-MM-dd.log',
    //包含模型
    alwaysIncludePattern: true,
  }]
})
var logger = log4js.getLogger();
logger.info('this is datefile');

結(jié)果:

//234-2017-09-23.log
[2017-09-23 16:17:06.764] [INFO] [default] - this is datefile

2.1.3 levelFilter 過濾篩選
/*
  loglevelFilter 過濾篩選
 */

log4js.configure({
  appenders:[
    //控制臺(tái)輸出
    {"type": "console"},
    { //日志過濾
      type: 'loglevelFilter',
      //  權(quán)重大于或者等于level【debug】的日志將會(huì)輸出
      level: 'WARN',
      //篩選model1
      category: 'model1',
      // 同時(shí)支持?jǐn)?shù)組
      // category:['model1', 'model2'],
      appender:{
        type: 'file',
        filename: '345.log'
      }
    }
  ],
  "replaceConsole": true

})

var logger = log4js.getLogger('model1');
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');

var logger = log4js.getLogger('model2');
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');

結(jié)果篩選如下

image.png

第三部分 layout配置

暫緩

第四部分 實(shí)例配置Express+log4js

4.1 需求一

  1. 每天生成一個(gè)日志文件,放在/logs目錄下偎快,名字如2017-09-23.log冯乘;
  2. 單獨(dú)將log4js配置在一個(gè)文件中,外界不需要每次配置晒夹;
  3. 記錄客戶端請(qǐng)求的HTTP狀態(tài)碼裆馒、URL姊氓、方法。
  4. 終端顯示所有日志信息喷好,日志文件只記錄WARN以及以上級(jí)別的信息翔横。

GitHub--地址

配置文件:logConfig.js

var log4js = require('log4js');
const fs = require('fs');

levels = {
    'trace': log4js.levels.TRACE,
    'debug': log4js.levels.DEBUG,
    'info': log4js.levels.INFO,
    'warn': log4js.levels.WARN,
    'error': log4js.levels.ERROR,
    'fatal': log4js.levels.FATAL
};

function judgePath(pathStr) {
    if (!fs.existsSync(pathStr)) {
        fs.mkdirSync(pathStr);
        console.log('createPath: ' + pathStr);
    }
}

log4js.configure({
  appenders:[
    //控制臺(tái)輸出
    {"type": "console"},
    {type: 'dateFile',
    //文件名為= filename + pattern, 設(shè)置為alwaysIncludePattern:true
    filename: 'logs/', // 需要手動(dòng)創(chuàng)建此文件夾
    pattern: 'yyyy-MM-dd.log',
    //包含模型
    alwaysIncludePattern: true,
  }],
  replaceConsole: true // 替換 console.log
})

exports.logger = function (name, level) {
    var logger = log4js.getLogger(name);
    //默認(rèn)為debug權(quán)限及以上
    logger.setLevel(levels[level] || levels['debug']);
    return logger;
};

exports.use = function (app, level) {
  //加載中間件
    app.use(log4js.connectLogger(log4js.getLogger('logInfo'), {
        level: levels[level] || levels['debug'],
      //格式化http相關(guān)信息
        format: ':method :url :status'
    }));
};

app.js使用中間件

var log4js = require('./config/logConfig.js');
var app = express();
log4js.use(app);

index.js中使用log4js

var express = require('express');
var router = express.Router();
//category名字為inde.js 只收錄warn以及以上權(quán)限信息
var logger = require('../config/logConfig.js').logger('index.js', 'warn');

/* GET home page. */
router.get('/', function (req, res, next) {
  //不顯示
    console.log('This is an index page!');
    logger.trace('This is an index page! -- log4js');
    logger.debug('This is an index page! -- log4js');
    logger.info('This is an index page! -- log4js');
    logger.warn('This is an index page! -- log4js');
    logger.error('This is an index page! -- log4js');
    logger.fatal('This is an index page! -- log4js');

    res.render('index', {title: 'log4js'});
});
module.exports = router;

4.2 需求二

2.x版本的區(qū)別

log4js.configure(...); // set up your categories and appenders
const logger = log4js.getLogger('console');
console.log = logger.info.bind(logger); // do the same for others - console.debug, etc.

log

暫緩

參考列表

Node.js 之 log4js 完全講解
log4js-Node.js中的日志管理模塊使用與封裝
Log4js配置詳解
nodejs開發(fā)——log4js學(xué)習(xí)
大搜車NodeJS日志規(guī)范化與分析監(jiān)控
基于node+express+log4js的前端異常信息監(jiān)控
node.js項(xiàng)目中使用log4js保存日志文件

更多精彩內(nèi)容請(qǐng)關(guān)注“IT實(shí)戰(zhàn)聯(lián)盟”哦~~~


IT實(shí)戰(zhàn)聯(lián)盟.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梗搅,隨后出現(xiàn)的幾起案子禾唁,更是在濱河造成了極大的恐慌,老刑警劉巖无切,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荡短,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哆键,警方通過查閱死者的電腦和手機(jī)掘托,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籍嘹,“玉大人闪盔,你說我怎么就攤上這事∝停” “怎么了锭沟?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長识补。 經(jīng)常有香客問我族淮,道長,這世上最難降的妖魔是什么凭涂? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任祝辣,我火速辦了婚禮,結(jié)果婚禮上切油,老公的妹妹穿的比我還像新娘蝙斜。我一直安慰自己,他們只是感情好澎胡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布孕荠。 她就那樣靜靜地躺著,像睡著了一般攻谁。 火紅的嫁衣襯著肌膚如雪稚伍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天戚宦,我揣著相機(jī)與錄音个曙,去河邊找鬼。 笑死受楼,一個(gè)胖子當(dāng)著我的面吹牛垦搬,可吹牛的內(nèi)容都是我干的呼寸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼猴贰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼对雪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糟趾,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤慌植,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后义郑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶柿,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年非驮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了交汤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劫笙,死狀恐怖芙扎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情填大,我是刑警寧澤戒洼,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站允华,受9級(jí)特大地震影響圈浇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靴寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一磷蜀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧百炬,春花似錦褐隆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至德澈,卻和暖如春虫埂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圃验。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缝呕,地道東北人澳窑。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓斧散,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摊聋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸡捐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容