debian

如何设置Node.js日志的自动备份策略

小樊
34
2025-07-01 10:25:38
栏目: 编程语言

设置Node.js日志的自动备份策略可以通过多种方式实现,以下是几种常见的方法:

方法一:使用 pm2pm2-logrotate

pm2 是一个流行的 Node.js 进程管理工具,它内置了日志管理功能,包括日志轮转。

  1. 安装 pm2

    npm install pm2 -g
    
  2. 启动你的 Node.js 应用

    pm2 start app.js
    
  3. 配置日志轮转pm2 默认会自动轮转日志文件,但你可以通过配置文件进一步自定义。

    创建一个 ecosystem.config.js 文件:

    module.exports = {
      apps: [{
        name: 'my-app',
        script: 'app.js',
        out_file: './out.log',
        error_file: './err.log',
        log_date_format: 'YYYY-MM-DD HH:mm Z',
        time: true,
        instances: 1,
        exec_mode: 'cluster',
        max_memory_restart: '1G',
        log_rotation: {
          period: '1d', // 每天轮转一次
          rotateAfterSize: '10M', // 每个日志文件达到10MB时轮转
          keepFiles: 7, // 保留最近7天的日志文件
        },
      }],
    };
    
  4. 启动应用并应用配置

    pm2 start ecosystem.config.js
    

方法二:使用 logrotate 工具

logrotate 是一个 Linux 系统自带的日志轮转工具,可以用来管理各种日志文件。

  1. 安装 logrotate(如果尚未安装):

    sudo apt-get install logrotate  # Debian/Ubuntu
    sudo yum install logrotate      # CentOS/RHEL
    
  2. 创建 logrotate 配置文件: 在 /etc/logrotate.d/ 目录下创建一个新的配置文件,例如 nodejs-app

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

    添加以下内容:

    /path/to/your/nodejs-app/out.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 640 root adm
    }
    
    /path/to/your/nodejs-app/err.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 640 root adm
    }
    
  3. 测试配置

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

方法三:使用 winston 和自定义脚本

如果你使用 winston 作为日志库,可以编写一个自定义脚本来定期备份日志文件。

  1. 安装 winston

    npm install winston
    
  2. 配置 winston

    const winston = require('winston');
    const fs = require('fs');
    const path = require('path');
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ filename: 'out.log' }),
        new winston.transports.File({ filename: 'err.log' }),
      ],
    });
    
    // 自定义日志备份脚本
    function backupLogs() {
      const logDir = path.dirname(require.resolve('your-app-log-file-path'));
      const backupDir = path.join(logDir, 'backup');
      if (!fs.existsSync(backupDir)) {
        fs.mkdirSync(backupDir);
      }
    
      const now = new Date().toISOString().replace(/:/g, '-').replace(/\.\d{3}Z$/, 'Z');
      const backupFiles = fs.readdirSync(backupDir).filter(file => file.startsWith('out-') || file.startsWith('err-'));
    
      backupFiles.forEach(file => {
        fs.unlinkSync(path.join(backupDir, file));
      });
    
      fs.renameSync('/path/to/your/nodejs-app/out.log', path.join(backupDir, `out-${now}.log`));
      fs.renameSync('/path/to/your/nodejs-app/err.log', path.join(backupDir, `err-${now}.log`));
    }
    
    // 每天备份日志
    setInterval(backupLogs, 86400000);
    
  3. 启动你的 Node.js 应用

    node app.js
    

通过以上方法,你可以根据具体需求选择合适的策略来自动备份 Node.js 日志文件。

0
看了该问题的人还看了