」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Winston 和 Morgan 的高階 Node.js API 日誌記錄

Winston 和 Morgan 的高階 Node.js API 日誌記錄

發佈於2024-07-31
瀏覽:219

Advanced Node.js API Logging with Winston and Morgan

日志记录是任何应用程序的重要组成部分,它提供对应用程序行为的洞察、帮助调试问题和监控性能。在 Node.js API 中,可以使用 Winston 和 Morgan 等库来实现高级日志记录。本文将指导您在 Node.js API 中设置和使用 Winston 和 Morgan 进行高级日志记录。

为什么需要高级日志记录
出于以下几个原因,高级日志记录至关重要:

  • 调试和故障排除:日志提供应用程序事件的详细历史记录,这在诊断问题时非常有用。它们有助于识别错误的根本原因并了解导致问题的操作顺序。

  • 监控和维护:持续监控日志允许开发人员跟踪应用程序的运行状况和性能。通过分析日志,您可以在异常、性能瓶颈和潜在问题变得严重之前检测到它们。

  • 审计和合规性:对于许多应用程序,尤其是那些处理敏感数据的应用程序,维护详细日志是合规性要求。日志提供用户操作和系统更改的记录,这对于审计和法规遵从性至关重要。

  • 安全:记录与安全相关的事件,例如失败的登录尝试、未经授权的访问和可疑活动,对于检测和响应安全威胁至关重要。高级日志记录有助于维护安全的应用程序环境。

目录

  1. 温斯顿和摩根简介
  2. 设置 Node.js 项目
  3. 安装温斯顿和摩根
  4. 配置 Winston 进行高级日志记录
  5. 集成 Morgan 以进行 HTTP 请求日志记录
  6. 温斯顿和摩根的结合
  7. 自定义日志记录格式
  8. 记录到不同的传输方式
  9. 错误处理和日志记录
  10. 结论

1.温斯顿和摩根简介
Winston 是一个多功能且易于使用的 Node.js 日志库。它支持日志消息的多种传输,这意味着您可以使用各种格式和级别记录到不同位置(控制台、文件、远程服务器等)。

Morgan 是 Node.js 的 HTTP 请求记录器中间件。它简化了以预定义格式记录 HTTP 请求的过程,这对于跟踪 API 中的传入请求和响应非常有用。

2.设置 Node.js 项目
首先,如果您还没有 Node.js 项目,请创建一个:

mkdir node-api-logging
cd node-api-logging
npm init -y

3.安装Winston和Morgan
安装 Winston 和 Morgan 以及 Express(用于设置基本 API):

npm install express winston morgan

4.配置 Winston 进行高级日志记录
创建 logger.js 文件来配置 Winston:

// logger.js
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf, errors } = format;

const customFormat = printf(({ level, message, timestamp, stack }) => {
  return `${timestamp} ${level}: ${stack || message}`;
});

const logger = createLogger({
  level: 'info',
  format: combine(
    timestamp(),
    errors({ stack: true }),
    customFormat
  ),
  transports: [
    new transports.Console(),
    new transports.File({ filename: 'logs/error.log', level: 'error' }),
    new transports.File({ filename: 'logs/combined.log' })
  ]
});

module.exports = logger;

5.集成 Morgan 以进行 HTTP 请求日志记录
创建一个 middleware/logger.js 文件以将 Morgan 与 Winston 集成:

// middleware/logger.js
const morgan = require('morgan');
const logger = require('../logger');

const stream = {
  write: (message) => logger.info(message.trim())
};

const morganMiddleware = morgan('combined', { stream });

module.exports = morganMiddleware;

6.温斯顿和摩根的结合
将 Winston 和 Morgan 集成到您的 Express 应用程序中:

// app.js
const express = require('express');
const logger = require('./logger');
const morganMiddleware = require('./middleware/logger');

const app = express();

// Use Morgan middleware for HTTP request logging
app.use(morganMiddleware);

// Example route
app.get('/', (req, res) => {
  logger.info('Hello world endpoint was called');
  res.send('Hello, world!');
});

// Error handling middleware
app.use((err, req, res, next) => {
  logger.error(err.message, { stack: err.stack });
  res.status(500).send('Something went wrong!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  logger.info(`Server is running on port ${PORT}`);
});

7.自定义日志格式
您可以自定义 Winston 和 Morgan 中的日志记录格式。例如,您可能想要记录其他请求详细信息,例如标头、查询参数或响应时间。

8.记录到不同的传输
Winston 支持各种传输。您可以根据消息的严重性记录到不同的目标。例如,您可能希望将错误日志发送到远程日志记录服务器或 Loggly 或 Papertrail 等第三方服务。

9.错误处理和日志记录
正确的错误处理和日志记录对于识别和解决问题至关重要。确保您的错误处理中间件使用 Winston 记录详细的错误信息。

10.结论
通过结合 Winston 和 Morgan,您可以在 Node.js API 中实现高级日志记录。 Winston 提供了一个用于记录应用程序级事件的强大框架,而 Morgan 则简化了 HTTP 请求的记录。它们共同为您提供全面的日志记录解决方案,增强您监控和调试应用程序的能力。

最终代码概述
以下是文件及其内容的快速回顾:

  • logger.js:使用自定义格式和传输配置 Winston。
  • middleware/logger.js:将 Morgan 与 Winston 集成。
  • app.js:设置 Express 应用程序,集成 Winston 和 Morgan。 通过此设置,您可以有效地记录和监控 Node.js API,从而更轻松地维护和调试。
版本聲明 本文轉載於:https://dev.to/dev_habib_nuhu/advanced-nodejs-api-logging-with-winston-and-morgan-4fb1?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    錯誤訊息「Strict Standards: Only Variables Should Be Passed by Reference」使用array_shift() 時,可能會報告嚴格標準如果傳遞的參數是函數呼叫的結果,則會發出警告。這種行為看起來不一致,因為它並不總是觸發警告。 考慮以下程式碼:...
    程式設計 發佈於2024-12-21
  • 如何在 Pandas 中進行聚合?
    如何在 Pandas 中進行聚合?
    Pandas 中的聚合如何使用 Pandas 執行聚合? 聚合函數會降低傳回物件的維度。一些常見的聚合函數包括mean()、sum()、size()、count()、std()、var()和sem()。 df1 = df.groupby(['A', 'B'], as_index=False)['C'...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    宣告const std::string 類型的靜態資料成員在C 中,直接在類別定義中初始化const std::string 類型的靜態資料成員是不允許。相反,有兩個選項可以定義此類資料成員:內聯變數(C 17 或更高版本)使用內聯變量,它定義並初始化類別定義中的靜態成員:class A { pri...
    程式設計 發佈於2024-12-21
  • 如何在 Python 中從函數內部取得函數名稱?
    如何在 Python 中從函數內部取得函數名稱?
    從函數內部存取函數名稱在Python 中,從函數本身內部確定函數名稱在動態自省的情況下非常有用inspect 模組提供了一個方便的機制來獲取有關正在運行的程式碼的資訊。使用inspect.stack(),我們可以存取表示目前呼叫堆疊的幀列表。 對於給定的函數,堆疊列表中的第一幀對應於當前函數,而第二...
    程式設計 發佈於2024-12-21
  • 如何將電子表格列索引號轉換為其等效字母?
    如何將電子表格列索引號轉換為其等效字母?
    將電子表格列索引轉換為字母在 Google 表格中,列用數字索引,從 1 開始。但是,為了方便起見,它們通常也使用字母來表示(例如,“A”表示第一列,“D”表示第四列)。數字索引和字母值之間的轉換通常是腳本任務所必需的。 實作此轉換的一種方法是透過以下函數:function getColumnLet...
    程式設計 發佈於2024-12-21
  • 為什麼 `reader.ReadString` 不刪除初始分隔符號?
    為什麼 `reader.ReadString` 不刪除初始分隔符號?
    reader.ReadString 不會去掉初始分隔符號reader.ReadString 不會去掉初始分隔符號為了創建一個程式來迎接名為Alice 或Bob 的用戶,開發人員遇到一個問題,即使是合法的名稱也會引發不受歡迎的回應。程式錯誤地拒絕了 Alice 和 Bob 的進入。 問題此問題源自於程...
    程式設計 發佈於2024-12-21
  • 如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    透過ServletContext存取WAR/WEB-INF目錄中的資源簡介: Java Web 應用程式通常將重要資源儲存在WAR/WEB-INF 目錄中。要存取這些資源,開發人員可以利用 ServletContext API。 問題:如何創建位於 WAR/WEB-INF中的資源的正確路徑資料夾,例...
    程式設計 發佈於2024-12-21
  • 如何使用 Bootstrap 隱藏響應式佈局中的元素?
    如何使用 Bootstrap 隱藏響應式佈局中的元素?
    使用Bootstrap 隱藏響應式佈局中的元素設計響應式佈局時,管理空間變得至關重要,尤其是在較小的螢幕上。 Bootstrap 為行動裝置提供了對折疊功能表列專案的支持,但是如果您想類似地隱藏其他頁面元素怎麼辦? 解決方案:解決方案:Bootstrap 提供了允許您的類別根據螢幕尺寸隱藏元素:超小...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    解決嵌入式Python 中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤嘗試將嵌入式Python 3.2 解譯器整合到對於C 應用程序,可能會出現指示“無法載入檔案系統編解碼器”的錯誤。當 Py_Initialize 函數無法註冊編解碼器搜尋函數時,會發生此錯誤。 要解決此問題,必須...
    程式設計 發佈於2024-12-21
  • JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    使用 JavaScript 擷取網頁螢幕截圖:可能嗎? 在基於 Web 的應用程式無所不在的世界中,對網頁進行螢幕截圖已成為可能成為開發人員和使用者的重要任務。然而,問題出現了:使用 JavaScript 捕獲網頁截圖並提交回伺服器是否可行? 使用 JavaScript 進行網頁截圖的挑戰由於由於瀏...
    程式設計 發佈於2024-12-21
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21
  • 如何使用 PHP 計算兩個日期之間的時差(以秒為單位)?
    如何使用 PHP 計算兩個日期之間的時差(以秒為單位)?
    計算兩個日期之間的時差(以秒為單位)計算兩個日期之間的時差(以秒為單位)在各種情況下都很有用。本文旨在為這項任務提供一個清晰的解決方案,解決先前 Stack Overflow 討論中面臨的挑戰。 確定兩個日期之間的時間跨度,例如“2011-05-12 18:20:20 ”和“2011-05-13 1...
    程式設計 發佈於2024-12-21
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3