做者:Corey Cleary翻譯:瘋狂的技術宅html
原文:https://www.coreycleary.me/us...前端
未經容許嚴禁轉載node
你是否有過這樣的經歷,當把 logging 添加到自定義 Node 模塊中,並認爲本身將會從這些額外信息中受益,卻發現當你將模塊添加爲依賴項並運行 npm install
和 npm start
時,你的程序日誌就會像下面嗎?git
你如何找到本身實際須要的信息?好比都有哪些用戶登陸以及什麼時候登陸,而不是來自應用程序依賴項的信息:程序員
一樣,當你懷疑因爲你的團隊對 Node 模塊依賴項所作的更改而致使性能降低時,惟一須要解決的日誌以下:github
從全局來看,這是日誌污染的樣子:面試
理想的日誌記錄方案可以使模塊日誌不進入程序或服務的日誌記錄,但可以在須要時將其打開以進行故障排除。express
爲此,我將向你展現如何使用 debug 模塊來打開或關閉 Node 模塊中的日誌。npm
若是你不須要它們,而且使用該模塊的服務運行良好,則將其設置爲 OFF。json
ON 用於遇到問題並須要儘量多的日誌信息時。
debug
模塊概述在功能方面,請不要像一般在調試器中那樣來考慮調試模塊(就像你在 ID E中設置斷點的方式同樣),而應更像是被修改後的 console
模塊。這是一種可以讓你根據須要打開和關閉日誌的工具。若是到其 GitHub頁面(https://github.com/visionmedi...),則還會看到它的其餘各類功能,例如命名空間等。暫時不用管這些,如今只須要知道它是一種能夠優化你的生產環境的工具便可。
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:server
和 http:error
),只需傳遞通配符 *
便可。
DEBUG=http:* node app-entrypoint.js
讓咱們看看這些日誌如今是什麼樣的:
而後,當咱們加載頁面時:
注意,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
debug
以及是如何使用的若是在文檔中沒有看到關因而否使用了 debug
的內容該怎麼辦? 即使如此,也有可能使用了該模塊,可是你必須進行一些挖掘。
咱們已經知道 Express 文檔中描述了該如何使用它,可是咱們假設它並無記錄在案:
首先,你能夠在項目的 GitHub(或其餘開放源代碼網站)上搜索 package.json
,而後查找其中列出的做爲依賴項的模塊:
確認後,你還須要確認 1)實際正在使用中,以及 2)切換須要使用哪些標誌。 GitHub 如今具備一項不錯的功能,你能夠在其中使用搜索欄搜索項目自己。若是咱們在 Express 項目中搜索「debug」,則會發現如下內容:
咱們能夠看到切換標記爲 「express」,所以 express:*
將爲咱們提供全部的日誌,express:view
將爲咱們提供視圖的日誌,等等。
但願你看到在 node 模塊中實現 debug
併爲第三方模塊打開它是多麼容易,以及它能夠怎樣幫你清理日誌,同時又爲你提供了一種方便的方法來將其從新打開進行故障排除。