”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Winston 和 Morgan 的高级 Node.js API 日志记录

Winston 和 Morgan 的高级 Node.js API 日志记录

发布于2024-07-31
浏览:131

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]删除
最新教程 更多>
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-12-21
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于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 18...
    编程 发布于2024-12-21
  • 插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入记录时如何解决“一般错误:2006 MySQL 服务器已消失”介绍:将数据插入 MySQL 数据库有时会导致错误“一般错误:2006 MySQL 服务器已消失”。当与服务器的连接丢失时会出现此错误,通常是由于 MySQL 配置中的两个变量之一所致。解决方案:解决此错误的关键是调整wait_tim...
    编程 发布于2024-12-21
  • 事件冒泡与捕获:事件传播模式如何影响 DOM 事件处理?
    事件冒泡与捕获:事件传播模式如何影响 DOM 事件处理?
    事件冒泡和捕获:了解 DOM 中的传播事件冒泡和捕获在 HTML DOM API 中的事件传播中发挥着至关重要的作用。为了理解它们的功能,让我们深入研究这两个概念的复杂性。事件冒泡与事件捕获当一个事件发生在嵌套在另一个元素中的元素中时,并且两个元素都为该特定事件注册了事件处理程序,事件传播模式决定了...
    编程 发布于2024-12-21
  • 如何有效地透视 Pandas DataFrame?
    如何有效地透视 Pandas DataFrame?
    如何对数据框进行透视?透视是一种转换,它采用具有代表类别的列和代表值的行的数据框,并重新定向它,以便类别位于行中,值位于列中,索引设置为原始行值。基本语法:df.pivot(index=<row_labels>, columns=<col_labels>, values=&l...
    编程 发布于2024-12-21
  • 最令人烦恼的解析:Timer() - 对象还是函数调用?
    最令人烦恼的解析:Timer() - 对象还是函数调用?
    最令人烦恼的解析:解开 C 11 中的歧义当使用统一初始化器时,C 11 中的“最令人烦恼的解析”歧义会出现,如以下代码片段所示:#include <iostream> class Timer { public: Timer() {} }; int main() { au...
    编程 发布于2024-12-21
  • 如何使用 Jersey 解决 JAX-RS 中的 CORS 问题?
    如何使用 Jersey 解决 JAX-RS 中的 CORS 问题?
    使用 Jersey 通过 JAX-RS 处理 CORS问题: 您在处理请求时遇到 CORS 问题与 JAX-RS 和泽西岛。具体来说,服务器未设置必要的 CORS 标头,导致错误“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”解决方案:要使用 Jersey 处理...
    编程 发布于2024-12-21
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-21
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于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
  • 如何在页面加载时从 JSP 调用 Servlet 以显示数据?
    如何在页面加载时从 JSP 调用 Servlet 以显示数据?
    如何在页面加载时从 JSP 调用 Servlet在某些情况下,您可能需要从 JSP 文件调用 Servlet,而无需使用 HTML 表单。例如,要在页面加载时在 HTML 表中显示数据库查询结果。使用 doGet() 方法的解决方案servlet 中的 doGet() 方法允许请求预处理并重定向到 ...
    编程 发布于2024-12-21
  • 如何自动将 MySQL 表转储到单独的文件中?
    如何自动将 MySQL 表转储到单独的文件中?
    自动将 MySQL 表转储到单独的文件内置 mysqldump 实用程序允许选择性表转储,但需要预先指定表名称。对于处理新表添加的动态方法,自动化解决方案是必要的。这样的解决方案之一是 shell 脚本,它动态查询数据库中的所有表名并将每个表转储到单独的压缩文件中。这样就无需在转储脚本中手动维护表名...
    编程 发布于2024-12-21
  • 当更新具有多个进程的大表时,如何解决 MySQL 数据库中的死锁?
    当更新具有多个进程的大表时,如何解决 MySQL 数据库中的死锁?
    理解MySQL锁死锁问题:5,000,000行的MySQL表很容易因为死锁而发生死锁并行 Perl 进程更新它。更新特定行时会发生死锁错误。原因:当两个或多个事务尝试以冲突的方式获取同一行上的锁时,就会发生死锁。在这种情况下,在 file_table 上使用 a_lock 的多个进程会尝试同时访问同...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3