溫馨提示×

如何設置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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女