使用 Morgan.js 記錄 HTTP 請求和錯誤
Morgan 是一個可用於 Node.js 的中介軟體,當我們需要記錄 HTTP 請求時可以使用它。它主要用於 Express 專案。
Morgan 幫助我們透過單一語句簡化應用程式傳送和接收的 HTTP 請求的日誌記錄工作。在正常情況下,開發人員經常手動編寫所有日誌記錄程式碼,最終需要記錄要儲存的內容、如何儲存以及所有內容的儲存位置。
它有助於收集伺服器日誌並準備讀取。它還內建了許多預定義的預設值來幫助開發人員。它適用於大型專案和小型專案。
設定 Morgan.js
像我們通常對任何 Node.js 模組一樣,可以使用 NPM 安裝 Morgan:
npm install morgan
設定完成後,可以透過告訴 Node.js 在你的應用程式中包含 Morgan 來使用此模組。
const morgan = require('morgan')
使用 Morgan 的簡單應用程式
現在我們已經熟悉了基礎知識,是時候關注建立一個非常簡單的應用程式,我們將在其中使用 Morgan 進行日誌記錄。請考慮以下程式碼。
index.js
示例
const express = require('express') const morgan = require('morgan') const app = express() const port = process.env.PORT || 8989 app.use(morgan('combined')) app.get('/', function(req, res) { res.send('TutorialsPoint is Awesome!!!') }) app.listen(port, () => { console.log(`Sample app listening at https://:${8989}`) })
在上面的程式碼中,我們演示了使用 Morgan 進行日誌記錄的簡易性。首先,我們匯入了 Morgan 包,然後將其新增為中介軟體,當我們向 "/" 端點發出 GET 請求時。
輸出
執行程式碼時,它將在終端上顯示以下輸出:
Sample app listening at https://:8989
點選連結後,它將在瀏覽器上顯示以下輸出:
TutorialsPoint is Awesome!!!
然後,它將在終端上列印日誌,如下所示:
::1 - - [28/Sep/2022:05:20:44 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
定義 Morgan 中日誌的輸出格式
我們可以透過兩種方式定義 Morgan 中日誌的輸出格式:
預定義日誌 - 此型別的輸出格式意味著有一些可用的預定義專案集,你只需要選擇適合你需求的組合。
手動設定 - 此手動設定是藉助令牌完成的。
Morgan 中的預定義日誌
總共有五種預定義格式,當我們想要使用 Morgan 快速獲取資訊時可以使用這些格式。
combined - 當我們想要將日誌設定為 Apache 標準組合格式時使用。
common - 它只是指常見的 Apache 標準格式。
dev - 它只不過是一個顏色編碼的日誌格式,這些顏色會隨著請求狀態而變化。
short - 這是較短的版本,其中列印的專案較少。
tiny - 比 short 格式更短的版本。
如果你想在 Morgan 中使用“format”函式,則需要tokens、req 和res。
簡單來說,req 就是 HTTP 請求,res 就是 HTTP 響應。
token 就是一個包含所有已宣告令牌的物件。
如果你使用這三樣東西,那麼該函式將返回一個字串,該字串將是“長行”或“null”,如果你認為不想記錄所有內容。
另一個預定義的格式是:
app.use(morgan('tiny'))
預定義令牌的format字串看起來像這樣:
app.use(morgan(':method :url :res[content-length] - :response-time ms'))
還需要注意的是,預定義格式字串可以產生與預定義令牌相同的結果。
“Tiny”格式的輸出看起來像這樣:
GET / 201 - - 45.730 ms
日誌令牌
如前所述,我們甚至可以建立自己的自定義令牌和日誌記錄格式,作為使用預定義格式的替代方法。Morgan 完全可以訪問 HTTP 請求和響應的內容。換句話說,即使應用程式使用自定義 HTTP 標頭,Morgan 仍然能夠記錄它們。
關鍵是你必須生成自己的令牌,如果你希望自定義中介軟體例程,這可以透過使用名稱和回撥函式呼叫morgan.token()函式來完成,該回調函式將用於建立令牌。
關於令牌的一種思考方式是,它們只不過是我們可以在中介軟體格式字串中使用的基本佔位符。預定義格式確實有效地執行了相同操作,但是你始終可以匹配和混合任何 13 個令牌,以獲得你想要的精確日誌行。
Morgan 為你提供了一個令牌,該令牌看起來與客戶端的使用者代理、請求的 URL 和響應時間完全一樣,除此之外還有其他內容。
現在讓我們考慮一個應用程式生成名為“type-of-user”的自定義 HTTP 標頭的情況,並且我們想要記錄此標頭的內容。我們可以使用以下程式碼片段。
morgan.token('type-of-user', function(req, res) {
return req.headers['type-of-user']
})
上面的程式碼生成一個新的自定義令牌,我們可以透過新增“:type-of-user”在 Morgan 日誌格式的程式碼中記錄它。
app.use(morgan(':method :url :status :type-of-user'));
它將在終端上記錄以下內容:
Server listening on port :8989 GET / 201 user
將日誌儲存到檔案
有時我們也希望將日誌重定向到特定檔案,而不僅僅是將它們轉儲到終端上的控制檯或應用程式輸出。
在 Morgan 中,我們可以透過建立一個新的 Stream 物件並將其提供給中介軟體來完成相同的操作。然後,我們將能夠將記錄器的輸出路由到單個檔案。請考慮以下程式碼片段。
let logStream = fs.createWriteStream(path.join(_dirname,'output.log'), { flags: 'a' }) // setting up the logger app.use(morgan('update', { stream: logStream }))
這個我們可以將日誌重定向到外部檔案的功能有助於提高開發人員的靈活性。
index.js
包含多個 Morgan “預定義”和“logStream”的最終程式碼如下所示:
const express = require('express') const morgan = require('morgan') const Writable = require("stream").Writable const app = express() const port = process.env.PORT || 8989 let logStream = fs.createWriteStream(path.join(_dirname, 'output.log'), { flags: 'a' }) // setting up the logger app.use(morgan('update', { stream: logStream })) class MyStream extends Writable { write(line) { console.log("Logger - ", line) } } // Create a new format morgan.token("timed", "A new :method request added for the :url. " + "In total, it took :total-time[2] milliseconds to be resolved") let writer = new MyStream() // Use the new format by name app.use(morgan('timed', { stream: writer })) app.get('/', function(req, res) { res.send('TutorialsPoint is Awesome!') }) app.listen(port, () => { console.log(`Application listening at https://:${port}`) })
結論
在本教程中,我們解釋瞭如何使用 Morgan 庫記錄文字並將其用作應用程式中的中介軟體。此外,我們討論了可用的預定義格式和自定義格式的型別,最後我們通過幾個示例探討了如何使用它們。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP