如何用node优雅地打印全链路日志

下面是详细的攻略。

1. 需求分析

在开发过程中,我们需要记录应用程序的全链路日志以便于排查问题和进行性能优化。要实现全链路日志,需要收集每个请求的相关信息,如请求方法、请求参数、响应状态码、响应时间、错误类型等信息。这些信息需要保留到一个日志文件中。

2. 策略设计

要优雅地打印全链路日志,我们需要使用以下策略:

  • 定义一个格式化文本日志中间件,将收集的日志信息格式化输出到控制台或日志文件;
  • 使用链式中间件设计模式,将格式化日志中间件与业务中间件组合起来;
  • 使用Node.js的核心模块util来格式化日志信息。

3. 实现步骤

第一步:创建格式化日志中间件

在Node.js中,我们可以使用morgan模块创建一个HTTP请求日志中间件,该模块可以很方便地记录HTTP请求响应的信息,但是它缺少一些额外的信息,如请求参数、错误信息等。因此,我们需要自定义一个格式化日志中间件来收集这些额外的信息。

以下是一个示例代码:

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;
const myFormat = printf(({ level, message, label, timestamp }) => {
  return `${timestamp} [${label}] ${level}: ${message}`;
});
const logger = createLogger({
  level: 'debug',
  format: combine(
    label({ label: 'my-app' }),
    timestamp(),
    myFormat
  ),
  transports: [
    new transports.Console(),
    new transports.File({ filename: 'combined.log' })
  ]
});

function logMiddleware(req, res, next) {
    const start = Date.now();
    const { method, url } = req;
    const { statusCode } = res;
    const duration = Date.now() - start;

    const logEntry = `[${method}] ${url} - ${statusCode} ${duration}ms`;
    logger.info(logEntry);
    next();
}

module.exports = logMiddleware;

上面代码中,我们使用了winston模块来创建一个logger对象。在日志格式化中,我们使用了format.combine方法将多个format打包到一起,其中timestamp方法用于添加时间戳,将日志中的label、时间戳、level、message以适当的格式进行输出。然后,我们在中间件中收集请求的相关信息,并将信息[String]格式调用logger.info方法记录在日志中。

第二步:使用链式中间件模式设计业务逻辑

可以在http.createServer()中,像如下代码一样将请求和日志中间件打通,使请求经过日志中间件记录完全请求信息后,进入路由处理(中间件链entry -> 中间件链 -> 路由)

const http = require('http')
const app = require('./app')

http.createServer(app).listen(3000, () => {
  console.log(`server is running on ${3000}`)
})

此时logger.info(logEntry)将记录请求的日志信息,你可以在控制台中或指定的日志文件中查看该信息。

示例一:使用中间件记录请求信息

const express = require('express')
const app = express()
const logMiddleware = require('./logMiddleware')

app.use(logMiddleware) // 自定义的日志中间件

app.get('/', (req, res) => {
  res.send('hello world')
})

app.listen(3000, () => {
  console.log(`server is running on ${3000}`)
})

上面代码中我们将日志中间件logMiddleware添加到中间件链的最上面,这将会保证路由处理前已经在日志中记录了请求的全部信息。

示例二:记录路由处理结果

我们可以使用try/catch来捕获处理过程中的异常,比如:

const express = require('express')
const app = express()
const logMiddleware = require('./logMiddleware')

// 将日志中间件添加到中间件链的最上面
app.use(logMiddleware)

app.get('/', (req, res) => {
  try {
    const data = { result: 'hello world' }
    res.json(data)
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
})

app.listen(3000, () => {
  console.log(`server is running on ${3000}`)
})

上面代码中我们保证了代码运行过程中任何错误都不会引起应用程序的崩溃,同时在异常发生时我们会返回一个响应来告诉客户端错误信息,并且这个错误信息也同样会被记录在日志中。

这样我们就可以轻松地记录应用程序的全链路日志了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何用node优雅地打印全链路日志 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Express + Session 实现登录验证功能

    以下是详细的“Express + Session 实现登录验证功能”的完整攻略。 什么是 Session Session 是用来存储用户与 web 服务器交互过程中产生的数据的一种机制。当用户访问 web 服务器时,服务器会生成一个 Session ID,用来标识用户的身份信息,将其发送给客户端,客户端在访问服务器时带上这个 Session ID,服务器根据…

    node js 2023年6月8日
    00
  • node中短信api实现验证码登录的示例代码

    下面是关于“node中短信API实现验证码登录的示例代码”的完整攻略。 什么是短信API和验证码登录 短信API是一种允许开发人员通过程序发送和接收短信的接口。验证码登录则是指在用户登录时使用手机短信验证码进行身份验证,用于增强用户账号的安全性。 实现步骤 实现短信API实现验证码登录的步骤如下: 选择一个合适的短信服务供应商,比如阿里云或腾讯云,注册账号并…

    node js 2023年6月8日
    00
  • Vue 响应式系统依赖收集过程原理解析

    Vue响应式系统是指Vue通过监控数据对象的变化状态来自动响应视图变化的系统。主要包括数据响应式绑定及依赖收集。其中,依赖收集是Vue响应式系统的重要部分。本文将对Vue响应式系统依赖收集过程的原理进行解析。 为何需要依赖收集 在编写Vue程序时,我们经常需要使用Vue的数据绑定功能。数据绑定实现数据驱动页面渲染,但是Vue并不知道实际的DOM结构和Java…

    node js 2023年6月8日
    00
  • nodejs的路径问题的解决

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,因为其高效、轻量、可扩展等特性,而被广泛应用于 Web 开发、服务器端开发等领域。在 Node.js 的开发过程中,经常会涉及到路径的操作,比如读取文件、创建目录等等,因此,如何解决 Node.js 的路径问题是开发者必须具备的技能之一。 路径的表示 在 Node.js …

    node js 2023年6月8日
    00
  • 在nodejs中创建child process的方法

    当我们需要在Node.js应用程序中执行一些长时间运行的任务或与其他应用程序交互时,我们可以使用child process模块创建子进程。 在Node.js中创建子进程,可以使用child_process模块。该模块提供了4个不同的方法。他们分别是: exec spawn fork execFile 下面我们分别讲解这4个方法。 exec方法 exec()方…

    node js 2023年6月8日
    00
  • Windows下nodejs安装及环境配置的实战步骤

    下面是详细的“Windows下nodejs安装及环境配置的实战步骤”攻略: 一. 下载Node.js 首先,我们需要下载Node.js的安装文件。请访问Node.js的官方网站(https://nodejs.org/),然后下载适合您计算机的版本,选择LTS版本即可。推荐使用Windows Installer (.msi)版本,下载完成后,双击打开,开始安装…

    node js 2023年6月8日
    00
  • Vue3渲染器与编译器深入浅析

    Vue3渲染器与编译器深入浅析 什么是Vue3渲染器与编译器? Vue3渲染器与编译器是Vue3的核心组件,负责将Vue3定义的模板语法,解析成浏览器可以理解的JavaScript代码,并将解析出来的JavaScript代码渲染到视图中。Vue3通过优化渲染器和编译器的性能,提高了Vue3的性能表现。 Vue3渲染器的工作原理 Vue3渲染器的工作原理可以简…

    node js 2023年6月8日
    00
  • Nest.js系列学习控制器使用示例详解

    首先,感谢您对本网站“Nest.js系列学习控制器使用示例详解”攻略的关注。以下是本攻略的完整内容。 一、 概述 本攻略主要介绍了Nest.js控制器的使用。由于控制器是Nest.js应用程序中的核心部分,因此了解控制器和掌握其使用方法非常重要。 什么是Nest.js的控制器? Nest.js的控制器是处理网络请求的核心组件。控制器处理传入的请求并在向客户端…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部