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

相关推荐
嗯.~30 分钟前
【无标题】如何在sheel中运行Spark
前端·javascript·c#
野犬寒鸦32 分钟前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
思考的橙子38 分钟前
Springboot之会话技术
java·spring boot·后端
兆。3 小时前
电子商城后台管理平台-Flask Vue项目开发
前端·vue.js·后端·python·flask
weixin_437398214 小时前
RabbitMQ深入学习
java·分布式·后端·spring·spring cloud·微服务·rabbitmq
sunbyte4 小时前
Tailwind CSS v4 主题化实践入门(自定义 Theme + 主题模式切换)✨
前端·javascript·css·tailwindcss
风之舞_yjf5 小时前
Vue基础(8)_监视属性、深度监视、监视的简写形式
javascript·vue.js·ecmascript
DONSEE广东东信智能读卡器5 小时前
蓝牙身份证阅读器使用Uniapp调用二次开发demo
javascript·uni-app·蓝牙·身份证阅读器
Codingwiz_Joy5 小时前
Day28 -js开发01 -JS三个实例:文件上传 & 登录验证 & 购物商城 & ---逻辑漏洞复现 及 判断js的payload思路
开发语言·javascript·安全·安全性测试
BillKu6 小时前
CSS实现图片垂直居中方法
前端·javascript·css