Nodejs logger中间件morgan生成的日志文件不会自动分割吗?

Nodejs logger中间件morgan生成的日志文件不会自动分割吗?

var fs = require(“fs”); // create a write stream (in append mode) var accessLogStream = fs.createWriteStream(’/data/logs/node/access.log’, {flags: ‘a’}) // setup the logger app.use(morgan(‘combined’, {stream: accessLogStream}))

上面代码的结果是所有日志内容都存储在access.log里,不像nginx生成的log自动分割

morgan:https://github.com/expressjs/morgan


2 回复

Nodejs logger中间件morgan生成的日志文件不会自动分割吗?

在使用Node.js的logger中间件morgan时,你可能会发现日志文件(如access.log)中的所有日志内容都会被追加到同一个文件中。这与某些其他日志系统(如Nginx)的行为不同,后者会根据时间或其他条件自动分割日志文件。

如何实现自动分割日志文件?

为了实现类似的功能,你可以使用第三方库来管理日志文件的分割。一个常用的库是winston,它提供了强大的日志记录功能,并且可以与其他库(如morgan)结合使用。

下面是一个简单的示例,展示如何使用winston来实现日志文件的自动分割:

  1. 安装必要的依赖

    npm install morgan winston
    
  2. 配置winston来分割日志文件

    const express = require('express');
    const winston = require('winston');
    const morgan = require('morgan');
    
    // 创建一个日志目录
    const logDir = 'logs';
    
    // 确保日志目录存在
    if (!fs.existsSync(logDir)) {
      fs.mkdirSync(logDir);
    }
    
    // 创建一个每日轮转的日志文件传输器
    const dailyRotateFile = new winston.transports.DailyRotateFile({
      filename: `${logDir}/access-%DATE%.log`,
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d'
    });
    
    // 创建一个winston日志记录器
    const logger = winston.createLogger({
      transports: [
        dailyRotateFile
      ]
    });
    
    // 设置morgan使用winston作为日志处理器
    app.use(morgan('combined', {
      stream: {
        write: message => logger.info(message.trim())
      }
    }));
    
    // 示例路由
    app.get('/', (req, res) => {
      logger.info(`${req.ip} - ${req.method} ${req.originalUrl}`);
      res.send('Hello World!');
    });
    

在这个示例中,我们使用了winston的日志轮转功能来创建每日轮转的日志文件。DailyRotateFile传输器会根据日期自动创建新的日志文件,并将旧的日志文件压缩归档。

解释

  • DailyRotateFile:这是一个Winston传输器,用于处理每日轮转的日志文件。
  • filename:指定日志文件的基本名称。
  • datePattern:定义日期格式,用于在文件名中插入日期。
  • zippedArchive:设置是否压缩旧的日志文件。
  • maxSizemaxFiles:用于限制单个日志文件的大小以及保留的文件数量。

通过这种方式,你可以轻松地实现类似于Nginx的日志文件自动分割功能,而不需要手动管理日志文件。


Morgan 是一个用于 Node.js 应用的日志中间件,通常与 Express 框架一起使用。它默认不会自动分割日志文件,而是将所有日志写入到指定的文件中。不过,你可以通过外部工具或自定义逻辑来实现日志文件的自动分割。

如果你希望实现日志文件的自动分割(例如按日期分割),可以考虑使用 winstonbunyan 等日志库,它们提供了更丰富的功能,包括日志文件的自动分割和轮转。

以下是一个使用 winston 实现日志文件自动分割的例子:

const winston = require('winston');
const { combine, timestamp, printf } = winston.format;

const myFormat = printf(({ level, message, timestamp }) => {
    return `${timestamp} ${level}: ${message}`;
});

const logger = winston.createLogger({
    format: combine(
        timestamp(),
        myFormat
    ),
    transports: [
        new winston.transports.DailyRotateFile({
            filename: 'application-%DATE%.log',
            datePattern: 'YYYY-MM-DD-HH',
            zippedArchive: true,
            maxSize: '20m',
            maxFiles: '14d'
        })
    ]
});

logger.stream = {
    write: function(message, encoding) {
        logger.info(message.trim());
    }
};

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

const app = express();
app.use(morgan('combined', { stream: logger.stream }));

在这个例子中,我们使用了 winstonDailyRotateFile 运输工具,它可以按天自动创建新的日志文件,并且支持日志文件的压缩和清理。

如果你仍然希望使用 Morgan 和 fs 模块,你可以手动管理日志文件的分割和清理逻辑,但这会增加开发和维护的复杂性。

回到顶部