手把手教你搭建 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 记录错误信息,方便调试和排错。

相关推荐
Nyarlathotep011315 分钟前
Redis的内存回收和对象共享
redis·后端
从文处安16 分钟前
「九九八十一难」从回调地狱到异步秩序:深入理解 JavaScript Promise
前端·javascript
进击的尘埃17 分钟前
Node.js 子进程管理:child_process 模块的正确打开方式
javascript
angerdream18 分钟前
最新版vue3+TypeScript开发入门到实战教程之Pinia详解
前端·javascript·vue.js
怜悯20 分钟前
uniapp 如何实现google登录-安卓端
前端·javascript
TT_哲哲20 分钟前
小程序解析字符串拼接多图 点击放大展示
前端·javascript
我叫黑大帅21 分钟前
Go 中最强大的权限控制库(Casbin)
后端·面试·go
腾讯云云开发1 小时前
用 OpenClaw + CloudBase 自动化开发网站:30分钟从安装到上线
后端·ai编程
独断万古他化1 小时前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
舒一笑1 小时前
🚀 我用一行命令,把 OSS 私有文件变成“可直接下载的公网链接”(很多人不会)
后端