手把手教你搭建 Express 日志系统,告别线上事故!

为什么需要日志中间件?

  • 追踪请求流程: 记录每个请求的详细信息,包括请求方法、URL、请求头、请求体等,让你了解请求的完整路径。
  • 监控应用状态: 记录应用的运行状态,例如错误信息、警告信息、性能指标等,让你及时发现潜在问题。
  • 调试和排错: 当应用出现问题时,通过分析日志,你可以快速定位问题,并找到解决方案。
  • 安全审计: 记录用户的操作行为,例如登录、修改数据等,为安全审计提供依据。

选择合适的日志库

Node.js 社区提供了丰富的日志库,常见的选择包括:

  • console.log (内置): 最简单的日志记录方式,但功能有限,不适合生产环境。
  • morgan: 专门用于记录 HTTP 请求日志的中间件,配置简单,功能强大。
  • winston: 功能强大的日志库,支持多种日志级别、输出目标和格式化选项。
  • pino: 高性能的 JSON 日志库,适合对性能有较高要求的应用。
  • bunyan: 结构化 JSON 日志库,方便分析和查询。

本文将以 morganwinston 为例,介绍如何在 Express 应用中使用日志中间件。

使用 morgan 记录 HTTP 请求日志

morgan 是一个轻量级的 HTTP 请求日志中间件,可以方便地记录请求的详细信息。

  1. 安装 morgan:

    bash 复制代码
    npm install morgan
  2. 在 Express 应用中使用 morgan:

    javascript 复制代码
    const express = require('express');
    const morgan = require('morgan');
    
    const app = express();
    
    // 使用 'dev' 格式记录日志
    app.use(morgan('dev'));
    
    // 或者使用自定义格式
    morgan.token('body', (req, res) => {
        return JSON.stringify(req.body);
    });
    app.use(morgan(':method :url :status :res[content-length] - :response-time ms :body'));
    
    app.get('/', (req, res) => {
        res.send('Hello World!');
    });
    
    app.post('/data', (req, res) => {
        res.send('Data received!');
    });
    
    app.listen(3000, () => {
        console.log('Server listening on port 3000');
    });

    morgan 提供了多种预定义的日志格式,例如 devcombinedcommon 等。你也可以自定义日志格式,以满足不同的需求。

使用 winston 进行更高级的日志记录

winston 提供了更强大的日志记录功能,例如支持多种日志级别、输出目标和格式化选项。

  1. 安装 winston:

    bash 复制代码
    npm install winston
  2. 配置 winston:

    javascript 复制代码
    const winston = require('winston');
    
    const logger = winston.createLogger({
        level: 'info',
        format: winston.format.combine(
            winston.format.timestamp(),
            winston.format.json()
        ),
        transports: [
            new winston.transports.File({ filename: 'error.log', level: 'error' }),
            new winston.transports.File({ filename: 'combined.log' }),
        ],
    });
    
    if (process.env.NODE_ENV !== 'production') {
        logger.add(new winston.transports.Console({
            format: winston.format.simple()
        }));
    }
    
    module.exports = logger;

    在上面的代码中,我们创建了一个 winston logger 实例,配置了日志级别、格式和输出目标。日志级别包括 errorwarninfoverbosedebugsilly 等。输出目标可以是控制台、文件、数据库等。

  3. 在 Express 应用中使用 winston:

    javascript 复制代码
    const express = require('express');
    const logger = require('./logger');
    
    const app = express();
    
    // 使用中间件记录请求日志
    app.use((req, res, next) => {
        logger.info({
            message: 'Incoming request',
            method: req.method,
            url: req.url,
            headers: req.headers,
            body: req.body,
        });
        next();
    });
    
    app.get('/', (req, res) => {
        logger.info('Hello World route accessed');
        res.send('Hello World!');
    });
    
    app.use((err, req, res, next) => {
        logger.error({
            message: 'Error occurred',
            error: err.message,
            stack: err.stack,
        });
        res.status(500).send('Something went wrong!');
    });
    
    app.listen(3000, () => {
        logger.info('Server listening on port 3000');
    });

    在上面的代码中,我们使用中间件记录每个请求的详细信息,包括请求方法、URL、请求头、请求体等。我们还使用 winston 记录错误信息,方便调试和排错。

相关推荐
华子w9089258594 分钟前
基于 SpringBoot+VueJS 的农产品研究报告管理系统设计与实现
vue.js·spring boot·后端
星辰离彬36 分钟前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
GetcharZp2 小时前
彻底告别数据焦虑!这款开源神器 RustDesk,让你自建一个比向日葵、ToDesk 更安全的远程桌面
后端·rust
ohMyGod_1232 小时前
React16,17,18,19新特性更新对比
前端·javascript·react.js
@大迁世界2 小时前
第1章 React组件开发基础
前端·javascript·react.js·前端框架·ecmascript
Hilaku3 小时前
从一个实战项目,看懂 `new DataTransfer()` 的三大妙用
前端·javascript·jquery
爱分享的程序员3 小时前
前端面试专栏-算法篇:20. 贪心算法与动态规划入门
前端·javascript·node.js
我想说一句3 小时前
事件委托与合成事件:前端性能优化的"偷懒"艺术
前端·javascript
爱泡脚的鸡腿3 小时前
Web第二次笔记
前端·javascript
Dream耀3 小时前
React合成事件揭秘:高效事件处理的幕后机制
前端·javascript