Nodejs express 错语日志的问题

Nodejs express 错语日志的问题

不知道express记录错误并写入日志文件应该怎么做,有成功过的伙伴,分享一下经验,谢谢!!!

6 回复

当然可以。在使用 Node.js 和 Express 时,记录错误并将其写入日志文件是一个非常常见的需求。这不仅可以帮助你追踪应用的运行情况,还可以在出现问题时快速定位问题所在。

下面我将提供一个简单的示例来展示如何设置 Express 应用来记录错误并将其写入日志文件。

步骤 1: 安装必要的依赖

首先,你需要安装 morganwinston 这两个库。morgan 是一个 HTTP 请求日志中间件,而 winston 则是一个强大的日志库。

npm install express morgan winston

步骤 2: 设置 Express 应用

接下来,我们将创建一个简单的 Express 应用,并配置它来记录错误到日志文件中。

const express = require('express');
const morgan = require('morgan');
const winston = require('winston');

// 配置 Winston 日志
const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    defaultMeta: { service: 'your-service-name' },
    transports: [
        //
        // - Write all logs with importance level of `error` or less to `error.log`
        // - Write all logs with importance level of `info` or less to `combined.log`
        //
        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()
    }));
}

// 使用 Morgan 中间件来记录 HTTP 请求
const app = express();
app.use(morgan('combined', {
    stream: {
        write: message => logger.info(message)
    }
}));

// 示例路由
app.get('/', (req, res) => {
    res.send('Hello World!');
});

// 错误处理中间件
app.use((err, req, res, next) => {
    logger.error(`${err.status || 500} - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`);
    res.status(err.status || 500);
    res.send({
        status: err.status || 500,
        message: err.message
    });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}.`);
});

解释

  1. Winston 配置: 我们配置了 winston 来将错误信息写入 error.log 文件,并将所有信息写入 combined.log 文件。
  2. Morgan 中间件: 使用 morgan 记录 HTTP 请求,并通过 stream 将其输出到 winston 的日志中。
  3. 错误处理中间件: 在最后添加了一个错误处理中间件,用于捕获所有未处理的错误,并将它们记录到日志中。

这样,你的 Express 应用就会自动记录所有的 HTTP 请求以及任何发生的错误,并将这些信息保存到指定的日志文件中。


或是有其他记录错误日志方法的伙伴也欢迎分享.

没人肯告诉一声

你可以自己写个中间件,第三方的也很多啊!

log4js 有for connect的日志中间件

要将Express应用中的错误记录到日志文件中,你可以使用morganwinston这两个流行的中间件。morgan用于HTTP请求日志,而winston则可以用来配置更详细的错误日志。以下是如何实现的步骤:

1. 安装依赖

首先,你需要安装必要的npm包:

npm install express morgan winston

2. 设置 Morgan 和 Winston

创建一个logger.js文件来设置winston,并在app.js或你的主服务器文件中使用它。

logger.js

const { createLogger, format, transports } = require('winston');

const logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss'
        }),
        format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
    ),
    transports: [
        new transports.File({ filename: 'error.log', level: 'error' }),
        new transports.File({ filename: 'combined.log' })
    ]
});

if (process.env.NODE_ENV !== 'production') {
    logger.add(new transports.Console({
        format: format.simple()
    }));
}

module.exports = logger;

app.js

const express = require('express');
const morgan = require('morgan');
const logger = require('./logger');

const app = express();

// 使用morgan记录HTTP请求
app.use(morgan('combined', {
    stream: {
        write: message => logger.info(message.trim())
    }
}));

// 处理错误的中间件
app.use((err, req, res, next) => {
    logger.error(`${err.status || 500} - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`);
    res.status(err.status || 500);
    res.json({
        message: err.message,
        status: err.status || 500,
        stack: process.env.NODE_ENV === 'production' ? null : err.stack
    });
});

// 启动服务器
const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

3. 测试错误记录

现在你可以通过发送一些无效的请求来测试错误日志是否正常工作。例如,尝试访问不存在的路由:

curl http://localhost:3000/invalid-route

检查error.log文件,你应该能看到类似如下的输出:

2023-04-01 12:00:00 ERROR: 404 - Cannot GET /invalid-route - /invalid-route - GET - ::1

这样,你就成功地配置了Express应用中的错误日志记录,并将其保存到了日志文件中。

回到顶部