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

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

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

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]刪除
最新教學 更多>
  • 跨域場景下CORS何時使用預檢請求?
    跨域場景下CORS何時使用預檢請求?
    CORS:了解跨域請求的「預檢」請求跨域資源共享(CORS) 在製作HTTP 時提出了挑戰跨域請求。為了解決這些限制,引入了預檢請求作為解決方法。 預檢請求說明預檢請求是先於實際請求(例如 GET 或 POST)的 OPTIONS 請求)並用於與伺服器協商請求的權限。這些請求包含兩個附加標頭:Acc...
    程式設計 發佈於2024-11-05
  • 如何使用 PHP 的 glob() 函數以副檔名過濾檔案?
    如何使用 PHP 的 glob() 函數以副檔名過濾檔案?
    在 PHP 中以副檔名過濾檔案使用目錄時,通常需要根據副檔名擷取特定檔案。 PHP 提供了一種使用 glob() 函數來完成此任務的有效方法。 若要以副檔名過濾文件,請使用語法:$files = glob('/path/to/directory/*.extension');例如,要檢索目錄/path...
    程式設計 發佈於2024-11-05
  • 理解 JavaScript 中的 Promise 和 Promise Chaining
    理解 JavaScript 中的 Promise 和 Promise Chaining
    什麼是承諾? JavaScript 中的 Promise 就像你對未來做某事的「承諾」。它是一個對象,表示非同步任務的最終完成(或失敗)及其結果值。簡而言之,Promise 充當尚不可用但將來可用的值的佔位符。 承諾國家 Promise 可以存在於以下三種狀態之一...
    程式設計 發佈於2024-11-05
  • 安全分配
    安全分配
    今天,關於 JavaScript 中安全賦值運算子 (?=) 的新提案引起了熱烈討論。我喜歡 JavaScript 隨著時間的推移而不斷改進,但這也是我最近在某些情況下遇到的問題。我應該將快速範例實作作為函數,對吧? 如果您還沒有閱讀該提案,以下是其建議: const [error, value]...
    程式設計 發佈於2024-11-05
  • 建立隊列介面
    建立隊列介面
    建立字元隊列的介面。 需要開發的三個實作: 固定大小的線性隊列。 循環隊列(複用數組空間)。 動態隊列(根據需要成長)。 1 建立一個名為 ICharQ.java 的檔案 // 字元隊列介面。 公共介面 ICharQ { // 向佇列中插入一個字元。 void put(char...
    程式設計 發佈於2024-11-05
  • Pip 的可編輯模式何時對本機 Python 套件開發有用?
    Pip 的可編輯模式何時對本機 Python 套件開發有用?
    使用Pip 在Python 中利用可編輯模式進行本地包開發在Python 的包管理生態系統中,Pip 擁有“- e”(或'--editable') 特定場景的選項。什麼時候使用這個選項比較有利? 答案在於可編輯模式的實現,官方文件中有詳細說明:「從本地以可編輯模式安裝專案(即setu...
    程式設計 發佈於2024-11-05
  • 當您在瀏覽器中輸入 URL 時會發生什麼?
    當您在瀏覽器中輸入 URL 時會發生什麼?
    您是否想知道當您在瀏覽器中輸入 URL 並按 Enter 鍵時幕後會發生什麼?這個過程比您想像的更加複雜,涉及多個步驟,這些步驟無縫地協同工作以提供您請求的網頁。在本文中,我們將探討從輸入 URL 到查看完全載入的網頁的整個過程,闡明使這一切成為可能的技術和協定。 第 1 步:輸入...
    程式設計 發佈於2024-11-05
  • 如何有效管理大量小HashMap物件的「OutOfMemoryError:超出GC開銷限制」?
    如何有效管理大量小HashMap物件的「OutOfMemoryError:超出GC開銷限制」?
    OutOfMemoryError: Handling Garbage Collection OverheadOutOfMemoryError: Handling Garbage Collection Overhead在Java中,當過多時會出現「java.lang.OutOfMemoryError:...
    程式設計 發佈於2024-11-05
  • 為什麼在 Python 列表初始化中使用 [[]] * n 時列表會連結在一起?
    為什麼在 Python 列表初始化中使用 [[]] * n 時列表會連結在一起?
    使用[[]] * n 進行列表初始化時的列表連結問題使用[[]] 初始化列表列表時 n,程式設計師經常會遇到一個意想不到的問題,即列表似乎連結在一起。發生這種情況是因為 [x]n 語法建立對相同基礎清單物件的多個引用,而不是建立不同的清單實例。 為了說明該問題,請考慮以下代碼:x = [[]] * ...
    程式設計 發佈於2024-11-05
  • Python 變得簡單:從初學者到進階 |部落格
    Python 變得簡單:從初學者到進階 |部落格
    Python Course Code Examples This is a Documentation of the python code i used and created , for learning python. Its easy to understand and L...
    程式設計 發佈於2024-11-05
  • 簡化 TypeScript 中的類型縮小和防護
    簡化 TypeScript 中的類型縮小和防護
    Introduction to Narrowing Concept Typescript documentation explains this topic really well. I am not going to copy and paste the same descrip...
    程式設計 發佈於2024-11-05
  • 何時應該使用 session_unset() 而不是 session_destroy() ,反之亦然?
    何時應該使用 session_unset() 而不是 session_destroy() ,反之亦然?
    理解PHP 中session_unset() 和session_destroy() 的區別PHP 函數session_unset() 和session_destroy() 有不同的用途管理會話數據。儘管它們在清除會話變數方面有明顯相似之處,但它們具有不同的效果。 session_unset() 與s...
    程式設計 發佈於2024-11-05
  • 如何選擇在 C++ 中解析 INI 檔案的最佳方法?
    如何選擇在 C++ 中解析 INI 檔案的最佳方法?
    在C 中解析INI 檔案:各種方法指南在C 處理初始化(INI) 檔案時,開發人員經常遇到有效解析這些文件以提取所需資訊的挑戰。本文探討了用 C 解析 INI 檔案的不同方法,討論了它們的優點和注意事項。 本機 Windows API 函數一種方法是利用 Windows API 函數INI 檔案處理...
    程式設計 發佈於2024-11-05
  • 程式碼日:重新聚焦
    程式碼日:重新聚焦
    2024 年 8 月 19 日星期一 今天是我 100 天程式設計之旅的一半! ?除了記錄我的進步之外,我還喜歡分享學習技巧。我最喜歡的新方法之一是番茄工作法,它需要專注於一項任務 25 分鐘,然後休息 5 分鐘。四個週期後,您會休息更長的時間。這有助於保持注意力並防止倦怠。 我嘗試過 App S...
    程式設計 發佈於2024-11-05
  • 為什麼我在 Visual Studio 2015 中收到編譯器錯誤 C2280「嘗試引用已刪除的函數」?
    為什麼我在 Visual Studio 2015 中收到編譯器錯誤 C2280「嘗試引用已刪除的函數」?
    Visual Studio 2015 中編譯器錯誤C2280「嘗試引用已刪除的函數」Visual Studio 2015 編譯器與其2013 的前身不同,自動為定義移動建構函式或移動賦值運算子的類別產生刪除的複製建構函式。 C 標準強制執行此行為,以防止在首選移動的情況下發生意外複製。 在您的程式碼...
    程式設計 發佈於2024-11-05

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

Copyright© 2022 湘ICP备2022001581号-3