Node.js日志框架:Winston模塊入門學(xué)習(xí)

前言

Winston是一款簡單测摔、通用且支持多種transport方式的日志庫暑中。在Winston模塊中灶体,一個transport方式就是對日志定義一種存儲位置或存儲設(shè)備钦讳,Logger的每個實例都可以配置多個不同級別的transport矿瘦。例如,可以將錯誤日志存儲在可持久保存的遠(yuǎn)程位置(如數(shù)據(jù)庫)也可以將日志輸出到控制臺或保存到本地文件中愿卒。
本文主要是對Winston模塊的入門學(xué)習(xí)缚去,主要講述了Logger的使用。更多操作可以參考Winston模塊的github主頁

安裝和使用

npm install --save winston

Logger的優(yōu)先級

在npm中琼开,為Logger設(shè)定了六種優(yōu)先級易结,優(yōu)先級越高,消息也就被認(rèn)為約重要柜候,對應(yīng)的整數(shù)便越小搞动,具體為:

{error : 0,warn : 1改橘,info : 2滋尉,verbose : 3,debug : 4飞主,silly : 5 }

從上面的例子中我們可以看到狮惜,對于優(yōu)先級的使用有兩種方法

  1. 將表示日志優(yōu)先級的參數(shù)傳遞給log()方法
  2. 使用Winston Logger中自帶指定優(yōu)先級的方法
  logger.log('silly', "127.0.0.1 - there's no place like home");
  logger.log('debug', "127.0.0.1 - there's no place like home");
  logger.log('verbose', "127.0.0.1 - there's no place like home");
  logger.log('info', "127.0.0.1 - there's no place like home");
  logger.log('warn', "127.0.0.1 - there's no place like home");
  logger.log('error', "127.0.0.1 - there's no place like home");
  logger.info("127.0.0.1 - there's no place like home");
  logger.warn("127.0.0.1 - there's no place like home");
  logger.error("127.0.0.1 - there's no place like home");

Logger的基本使用

使用默認(rèn)的Logger

使用Winston模塊,我們可以直接使用默認(rèn)的Logger碌识,可以調(diào)用默認(rèn)Logger的實例中的任何一個函數(shù)碾篡。例子如下:

var winston = require('winston');//聲明Winston模塊

winston.log('info', 'Hello distributed log files!');
//在console輸出:info: Hello distributed log files!

winston.info('Hello again distributed logs');
//在console輸出:info: Hello again distributed logs

winston.level = 'debug';//定義Logger的級別為debug
winston.log('debug', 'Now my debug messages are written to console!');
//在console輸出:debug: Now my debug messages are written to console!

在默認(rèn)情況下,所有的transport都是顯示在console中的筏餐,我們可以使用add()和remove()方法來添加或者刪除transport开泽。

//添加一個`transport`,保存位置為somefile.log文件
winston.add(winston.transports.File, { filename: 'somefile.log' });
//刪除一個`transport`魁瞪,不在console中顯示
winston.remove(winston.transports.Console);

也可以使用configure()函數(shù)來創(chuàng)建一個新的transport

winston.configure({
  transports: [
    new (winston.transports.File)({ filename: 'somefile.log' })
  ]
});

使用自定義的Logger

加入我們想更好地管理Logger,那么可以使用自定義的Logger嗽冒,例子如下:

//創(chuàng)建一個新的Logger呢袱,定義兩種`transport`方式
//一個`transport`為顯示在console
//一個`transport`為保存到本地文件
var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)(),
    new (winston.transports.File)({ filename: 'somefile.log' })
  ]
});

在完成了對Logger的定義之后,便可以在文件中對其進行使用:

//使用自定義的Logger
//將信息顯示在console,同時保存到本地文件
logger.log('info', 'Hello distributed log files!');
logger.info('Hello again distributed logs');

對于自定義的Logger,同樣可以對transport方式進行添加和刪除:

logger
  .add(winston.transports.File)//添加`transport`方式
  .remove(winston.transports.Console);//刪除`transport`方式

和默認(rèn)的Logger類似,我們也可以使用configure方法來批量定義winston.Logger的實例:

var logger = new winston.Logger({
  level: 'info',
  transports: [
    new(winston.transports.Console)(),
    new(winston.transports.File)({
      filename: 'somefile.log'
    })
  ]
});
//批量定義`transport`類型
logger.configure({
  level: 'verbose',
  transports: [
    new(require('winston-daily-rotate-file'))(opts)
  ]
});

相同類型的多個transport

對于自定義的Logger泣崩,我們可以對其定義多個相同類型的的transport方式,然后設(shè)定不同的嚴(yán)重級別洛口,根據(jù)級別的不同設(shè)定不同的處理方式矫付,例如:對于info類型就在console中顯示,對于error類型就保存在本地文件中第焰。

var logger = new (winston.Logger)({
  transports: [
    //info級別的保存在filelog-info.log文件中
    new (winston.transports.File)({
      name: 'info-file',
      filename: 'filelog-info.log',
      level: 'info'
    }),
    //error級別的保存在filelog-error.log文件中
    new (winston.transports.File)({
      name: 'error-file',
      filename: 'filelog-error.log',
      level: 'error'
    })
  ]
});

對于設(shè)定好的Logger买优,我們可以根據(jù)不同transportname參數(shù),對其進行刪除:

logger.remove('info-file');//刪除name為info-file的`transport`

也可以根據(jù)不同transport在Logger中的聲明順序進行刪除樟遣,代碼如下:

//刪除第一個`transport`
var infoFile = logger.transports[0];
logger.remove(infoFile);

Logger之間共享transport

對于Logger之前共享transport而叼,可以通過三種方法進行實現(xiàn):

  1. transport在默認(rèn)的container中設(shè)定
  2. transport加入到winston.container的構(gòu)造函數(shù)中
  3. transport加入.get().add()方法
  var winston = require('winston');
  // 1.將`transport`設(shè)置在默認(rèn)的container中
  winston.loggers.options.transports = [
    // Setup your shared transports here
  ];

  // 2.將`transport`加入到`winston.container`的構(gòu)造函數(shù)中 
  var container = new winston.Container({
    transports: [
      // Setup your shared transports here
    ]
  });

  // 3. 將`transport`加入`.get()`和`.add()`方法
  winston.loggers.add('some-category', {
    transports: [
      // Setup your shared transports here
    ]
  });
  container.add('some-category', {
    transports: [
      // Setup your shared transports here
    ]
  });

跨文件使用Logger

當(dāng)項目的規(guī)模到達一定程度的時候,如果想系統(tǒng)的管理代碼豹悬,則Winston日志模塊便會十分有用葵陵。我們可以在一個文件中專門定義各種Logger和transport,然后將其作為一個模塊進行導(dǎo)出瞻佛。在需要使用的文件中脱篙,則將其引用,根據(jù)需求進行調(diào)用伤柄。例子:

//在winston.js文件中定義Logger
exports.logger = new(winston.Logger)({
  transports: [
    new winston.transports.File({
      name: 'error',
      colorize: true,
      timestamp: true,
      level: 'error',
      filename: 'project.log',
      json: true
    }),
    new winston.transports.File({
      name: 'info',
      colorize: true,
      timestamp: true,
      level: 'info',
      filename: 'project.log',
      json: true
    })
  ]
})
//在useWinston.js文件中使用Logger
var winston = require('./winston')
winston.logger.log('error', 'some error')
winston.logger.log('info', 'some info')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绊困,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子适刀,更是在濱河造成了極大的恐慌秤朗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笔喉,死亡現(xiàn)場離奇詭異取视,居然都是意外死亡,警方通過查閱死者的電腦和手機常挚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門作谭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奄毡,你說我怎么就攤上這事折欠。” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵锐秦,是天一觀的道長咪奖。 經(jīng)常有香客問我,道長农猬,這世上最難降的妖魔是什么赡艰? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任售淡,我火速辦了婚禮斤葱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揖闸。我一直安慰自己揍堕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布汤纸。 她就那樣靜靜地躺著衩茸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贮泞。 梳的紋絲不亂的頭發(fā)上楞慈,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音啃擦,去河邊找鬼囊蓝。 笑死,一個胖子當(dāng)著我的面吹牛令蛉,可吹牛的內(nèi)容都是我干的聚霜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼珠叔,長吁一口氣:“原來是場噩夢啊……” “哼蝎宇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祷安,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姥芥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汇鞭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凉唐,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年虱咧,在試婚紗的時候發(fā)現(xiàn)自己被綠了熊榛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡腕巡,死狀恐怖玄坦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤煎楣,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布豺总,位于F島的核電站,受9級特大地震影響择懂,放射性物質(zhì)發(fā)生泄漏喻喳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一困曙、第九天 我趴在偏房一處隱蔽的房頂上張望表伦。 院中可真熱鬧,春花似錦慷丽、人聲如沸蹦哼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纲熏。三九已至,卻和暖如春锄俄,著一層夾襖步出監(jiān)牢的瞬間局劲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工奶赠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鱼填,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓车柠,卻偏偏與公主長得像剔氏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竹祷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理谈跛,服務(wù)發(fā)現(xiàn),斷路器塑陵,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評論 25 707
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況感憾,周期性的記錄到文件中供其他應(yīng)用進行統(tǒng)計分析...
    時待吾閱讀 4,988評論 0 6
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進行統(tǒng)計分析...
    時待吾閱讀 5,052評論 1 13
  • 如何識別遇到電話障礙 ——“許多銷售員給對方即使打了上百次電話令花,還是找不到要找的人阻桅,他們都不知道其實是碰上了電話障...
    普實軟件閱讀 384評論 0 0