怎樣避免Node.js模塊的日誌污染程序日誌

做者:Corey Cleary

翻譯:瘋狂的技術宅html

原文:https://www.coreycleary.me/us...前端

未經容許嚴禁轉載node

你是否有過這樣的經歷,當把 logging 添加到自定義 Node 模塊中,並認爲本身將會從這些額外信息中受益,卻發現當你將模塊添加爲依賴項並運行 npm installnpm start 時,你的程序日誌就會像下面嗎?git

Screen-Shot-2018-07-10-at-6.19.59-PM.png

你如何找到本身實際須要的信息?好比都有哪些用戶登陸以及什麼時候登陸,而不是來自應用程序依賴項的信息:程序員

Screen-Shot-2018-07-10-at-6.19.59-PM-1.png

一樣,當你懷疑因爲你的團隊對 Node 模塊依賴項所作的更改而致使性能降低時,惟一須要解決的日誌以下:github

Screen-Shot-2018-07-10-at-6.24.53-PM.png

從全局來看,這是日誌污染的樣子:面試

logging-node-module.png

咱們想要什麼

理想的日誌記錄方案可以使模塊日誌不進入程序或服務的日誌記錄,但可以在須要時將其打開以進行故障排除。express

爲此,我將向你展現如何使用 debug 模塊來打開或關閉 Node 模塊中的日誌。npm

若是你不須要它們,而且使用該模塊的服務運行良好,則將其設置爲 OFFjson

ON 用於遇到問題並須要儘量多的日誌信息時。

debug 模塊概述

在功能方面,請不要像一般在調試器中那樣來考慮調試模塊(就像你在 ID E中設置斷點的方式同樣),而應更像是被修改後的 console 模塊。這是一種可以讓你根據須要打開和關閉日誌的工具。若是到其 GitHub頁面(https://github.com/visionmedi...),則還會看到它的其餘各類功能,例如命名空間等。暫時不用管這些,如今只須要知道它是一種能夠優化你的生產環境的工具便可。

在你本身的 Node 模塊中實現debug

讓咱們來看一個在代碼中使用 debug 的例子。假設下面是一個模塊:

const debug = require('debug');
const log = debug('http:server');
const http = require('http');
const name = 'Demo App for debug module';
 
log('booting %o', name);
 
http.createServer((req, res) => {
  log(req.method + ' ' + req.url);
  res.end('debug example\n');
}).listen(3200, () => {
  log('listening');
});

實現 debug 很容易。咱們要作的就是 import 或 require 模塊,而後建立一個logger —— const log = debug('http:server'); 。你只需將特定 logger 的標記或命名空間 ‘http:server‘ 傳遞給 DEBUG 環境變量,以啓用調試功能便可。

啓動應用程序時(即導入該模塊的程序),你將會像這樣去啓動它:

DEBUG=http:server node app-entrypoint.js

若是咱們但願使用單獨的 logger 來切換某些日誌怎麼辦?例如,若是咱們只想切換到 error 怎麼辦?就像建立另外一個 logger 同樣簡單,就像這樣:

const debug = require('debug');
const log = debug('http:server');
const errorLogger = debug('http:error'); // create new logger here, passing it a new namespace
const http = require('http');
const name = 'Demo App for debug module';
 
log('booting %o', name);
 
http.createServer((req, res) => {
  log(req.method + ' ' + req.url);
  res.end('hello\n');
 
  // fake an error to demonstrate using debug for http:error namespace
  setTimeout(() => {
    errorLogger('fake error'); // then call the logger 
  }, 1000);
}).listen(3200, () => {
  log('listening');
});

以下所示將會僅打開錯誤:

DEBUG=http:error node app-entrypoint.js

並且,當你要記錄全部命名空間的日誌時(在這種狀況下,是 http:serverhttp:error),只需傳遞通配符 * 便可。

DEBUG=http:* node app-entrypoint.js

讓咱們看看這些日誌如今是什麼樣的:

Screen-Shot-2018-07-10-at-7.33.54-AM.png

而後,當咱們加載頁面時:

Screen-Shot-2018-07-10-at-7.34.03-AM.png

注意,debug 會寫入 stderr 而不是 stdout,因此若是你有一個根據不一樣的來源提取日誌的日誌路由,這些調試日誌將最終會存儲在 stderr 流中。

最後,你還能夠選擇:

  • 你能夠記錄全部用 debug 編寫的模塊的日誌。
  • 或者,你仍然能夠用 console.log()/console.error() 記錄某些內容,而另外一些記錄 debug

若是你有必需要記錄的事項,而且與使用該模塊的應用程序有關,請用 console 將其記錄下來。可是若是你不這樣作,就會用 debug 記錄全部的內容。

爲第三方模塊打開 debug

到目前爲止,若是你(或你的團隊)編寫了該模塊,那麼咱們所介紹的內容就很棒。

可是若是你用的是第三方模塊,那須要打開調試時該怎麼辦?

也許你已經對程序的各個部分進行了故障排除,不夠如今假設你正在使用的開源模塊可能會讓你遇到問題。

好消息是,debug 是一個使用很是普遍的模塊,npm 中的許多模塊可能都在用它。第三方模塊的建立者知道(至少,應該知道)該模塊的用戶真的不但願默認狀況下進行記錄,由於全部其餘的日誌均可能會變得雜亂無章。

因爲 Express 內部使用了 debug 模塊,因此若是你用了 Express 並須要對其進行故障排除,則能夠經過運行如下命令打開日誌:

DEBUG=express:* node your-app-entrypoint.js

查看開源 node 模塊是否使用了 debug 以及是如何使用的

若是在文檔中沒有看到關因而否使用了 debug 的內容該怎麼辦? 即使如此,也有可能使用了該模塊,可是你必須進行一些挖掘。

咱們已經知道 Express 文檔中描述了該如何使用它,可是咱們假設它並無記錄在案:

首先,你能夠在項目的 GitHub(或其餘開放源代碼網站)上搜索 package.json,而後查找其中列出的做爲依賴項的模塊:

Screen-Shot-2018-07-10-at-7.52.55-AM-1.png

確認後,你還須要確認 1)實際正在使用中,以及 2)切換須要使用哪些標誌。 GitHub 如今具備一項不錯的功能,你能夠在其中使用搜索欄搜索項目自己。若是咱們在 Express 項目中搜索「debug」,則會發現如下內容

Screen-Shot-2018-07-09-at-7.55.35-PM.png

咱們能夠看到切換標記爲 「express」,所以 express:* 將爲咱們提供全部的日誌,express:view 將爲咱們提供視圖的日誌,等等。

總結

但願你看到在 node 模塊中實現 debug 併爲第三方模塊打開它是多麼容易,以及它能夠怎樣幫你清理日誌,同時又爲你提供了一種方便的方法來將其從新打開進行故障排除。


本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎繼續閱讀本專欄其它高贊文章:


相關文章
相關標籤/搜索