linux

Node.js日志轮转配置详解

小樊
50
2025-07-28 13:42:40
栏目: 编程语言

在Node.js中配置日志轮转可以通过多种方式实现,以下是几种常见的方法:

使用 Winston 和 winston-daily-rotate-file

Winston 是一个非常流行的Node.js日志库,结合 winston-daily-rotate-file 可以实现日志的每日轮转。

安装依赖

npm install winston winston-daily-rotate-file

配置 Winston

const winston = require('winston');
const { createLogger, format, transports } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.printf(({ timestamp, level, message }) => {
      return `${timestamp} ${level}: ${message}`;
    })
  ),
  transports: [
    new DailyRotateFile({
      filename: 'logs/application-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d'
    })
  ]
});

module.exports = logger;

使用日志记录器

const logger = require('./logger');
logger.info('Server is running on port 3000');

使用 Morgan 和 morgan-body-parser(适用于 Express 框架)

如果你使用的是 Express 框架,可以结合 morganmorgan-body-parser 来实现日志轮转。

安装依赖

npm install morgan morgan-body-parser

配置 Morgan

const express = require('express');
const morgan = require('morgan');
const { createLogger, format, transports } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');

const app = express();
const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.printf(({ timestamp, level, message }) => {
      return `${timestamp} ${level}: ${message}`;
    })
  ),
  transports: [
    new DailyRotateFile({
      filename: 'access-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d'
    })
  ]
});

app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } }));

app.post('/example', (req, res) => {
  res.send('Example endpoint');
});

app.listen(3000, () => {
  logger.info('Server is running on port 3000');
});

使用 PM2 的日志管理功能

如果你使用 PM2 来管理 Node.js 应用,可以利用其内置的日志管理功能来实现日志轮转。

启动应用

pm2 start app.js --name my-app

配置日志轮转

pm2 set pm2:log - date - format "YYYY-MM-DD HH:mm:ss"
pm2 set pm2:max - size "20M"
pm2 set pm2:retain "14d"

使用 logrotate(适用于 Linux 系统)

Linux 自带的 logrotate 工具可以自动处理日志轮转,适用于生产环境。

创建 logrotate 配置文件

sudo nano /etc/logrotate.d/node-app

添加以下内容:

/var/log/node-app.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  copytruncate
  dateext
}

测试 logrotate

sudo logrotate -f /etc/logrotate.d/node-app

使用 log4js-node 模块

const log4js = require('log4js');
log4js.configure({
  appenders: {
    file: {
      type: 'file',
      filename: 'app.log',
      maxLogSize: 10485760, // 10MB
      backups: 5, // 保留5个备份
      compress: true // 压缩备份
    }
  },
  categories: {
    default: { appenders: ['file'], level: 'info' }
  }
});

const logger = log4js.getLogger();

使用 Bunyan 和 rotating-file-stream

const bunyan = require('bunyan');
const rfs = require('rotating-file-stream');
const stream = rfs.createStream('app.log', {
  size: '10M', // 每个文件10MB
  interval: '1d', // 每天轮转
  compress: 'gzip', // 压缩旧日志
  path: '/path/to/logs'
});

const logger = bunyan.createLogger({
  name: 'myapp',
  streams: [{
    level: 'info',
    stream: stream
  }]
});

0
看了该问题的人还看了