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

yizhihongxing

下面是详细的攻略。

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日

相关文章

  • Solaris新手必读-121个问题解答

    让我对“Solaris新手必读-121个问题解答”这个攻略进行详细讲解。 Solaris新手必读-121个问题解答 简介 该攻略是针对Solaris新手的一份完整文档,通过回答121个常见问题,让用户能够轻松地入门并掌握Solaris操作系统。本攻略包含多种问题,包括文件系统管理、网络配置、安装和升级、用户和组管理、安全等多个方面。用户可以通过该攻略更好地理…

    node js 2023年6月8日
    00
  • node.js-path模块你了解多少

    下面是详细讲解“node.js-path模块”的攻略: 什么是path模块 在Node.js中,path模块提供了处理文件路径的工具,它可以轻松地处理Linux、Windows和OS X等操作系统的路径问题。Path通常是一个类UNIX风格的路径名,但是也支持Windows风格的路径名。Path模块提供了各种实用的功能来解析和组合路径。 Path模块的常用方…

    node js 2023年6月8日
    00
  • Nodejs调用Dll模块的方法

    当我们需要在Node.js中使用C++编写的动态链接库(DLL)时,就需要调用DLL模块了。下面是一份详细的Node.js调用DLL模块的攻略,包含以下内容: 确认操作系统(Windows / Linux)支持动态链接库(DLL)。 编写C++ DLL模块并使用“__stdcall”或“extern ‘C’”调用约定标记。在导出函数之前,必须使用“exter…

    node js 2023年6月8日
    00
  • 浅谈高大上的微信小程序中渲染html内容—技术分享

    下面是“浅谈高大上的微信小程序中渲染html内容—技术分享”完整攻略。 1. 背景 随着微信小程序的不断发展,越来越多的开发者开始尝试在小程序中加载和渲染html内容,为用户呈现更加多样化、丰富的信息体验。但是,由于小程序和普通网页的差异性,导致小程序中渲染html内容的难度和复杂度较高。 2. 方案 2.1. 方案一:wxParse wxParse是一款基…

    node js 2023年6月8日
    00
  • nodejs进阶(6)—连接MySQL数据库示例

    Node.js 是一个非常流行的 JavaScript 运行时环境,可以用于开发服务器端应用程序。其中连接 MySQL 数据库是非常常见的需求,这里提供一个简单的示例来完成该操作。 步骤一:安装MySQL数据库 首先,需要在本地环境中安装 MySQL 数据库,以便连接和测试。MySQL 官方提供了可用于大多数操作系统的安装包和安装说明。一般来说,可以选择适合…

    node js 2023年6月8日
    00
  • nodejs+express实现文件上传下载管理网站

    下面是“nodejs+express实现文件上传下载管理网站”的完整攻略。 第一步:初始化项目 首先,需要在本地创建一个空的文件夹,并进入该文件夹: mkdir file-manager cd file-manager 接着,需要使用npm初始化该项目: npm init -y 这将会生成一个package.json文件,用于配置项目信息和依赖项。 第二步:…

    node js 2023年6月8日
    00
  • 详解Node.js 命令行程序开发教程

    详解Node.js 命令行程序开发教程 概述 本教程主要介绍如何使用Node.js开发命令行程序。命令行程序是一种无需图形化界面即可在终端运行的程序。Node.js提供了丰富的模块和工具,使得命令行程序的开发变得更加简单和高效。 环境准备 首先需要安装Node.js环境,并确保node命令可以在终端中运行。安装方法可以参考官方文档。 另外,推荐使用yargs…

    node js 2023年6月8日
    00
  • node.js命令行教程图文详解

    Node.js命令行教程图文详解 简介 Node.js是一个开源的、跨平台的、基于Chrome V8引擎的JavaScript运行环境。它可以使JavaScript脱离浏览器运行在服务器上,是高效处理高并发I/O的首选技术之一。Node.js包含了一个全局命令行工具,可以通过命令行执行JavaScript文件。通过学习Node.js命令行,我们可以更加高效地…

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