溫馨提示×

Linux環境中Node.js日志清理策略

小樊
40
2025-10-19 11:32:51
欄目: 編程語言

Linux環境下Node.js日志清理策略

1. 使用logrotate工具(系統級推薦)

logrotate是Linux系統自帶的日志管理工具,支持自動輪轉、壓縮、刪除舊日志,無需修改應用代碼,適合大多數場景。

  • 安裝logrotate
    Debian/Ubuntu系統運行sudo apt-get install logrotate;CentOS/RHEL系統運行sudo yum install logrotate。
  • 配置logrotate
    /etc/logrotate.d/目錄下創建Node.js專用配置文件(如nodejs),內容示例如下:
    /path/to/your/nodejs/logs/*.log {
        daily                # 每天輪轉一次(可選:weekly/monthly)
        missingok            # 日志文件不存在時不報錯
        rotate 7             # 保留最近7個輪轉日志
        compress             # 壓縮舊日志(節省空間)
        notifempty           # 日志為空時不輪轉
        create 0640 root adm # 新日志文件權限及屬主(根據實際調整)
    }
    
  • 測試配置
    手動觸發輪轉以驗證配置是否正確:sudo logrotate -f /etc/logrotate.d/nodejs。

2. 使用Node.js日志庫內置輪轉(應用級精準控制)

若應用使用winston、pino等日志庫,可通過內置模塊實現日志輪轉,適合需要定制化日志格式或路徑的場景。

  • winston + winston-daily-rotate-file
    安裝依賴:npm install winston winston-daily-rotate-file。
    配置示例:
    const winston = require('winston');
    const DailyRotateFile = require('winston-daily-rotate-file');
    
    const transport = new DailyRotateFile({
        filename: '/path/to/logs/application-%DATE%.log', // 日志文件名模板(%DATE%會被替換為日期)
        datePattern: 'YYYY-MM-DD',                         // 日期格式(每天一個文件)
        zippedArchive: true,                               // 壓縮舊日志
        maxSize: '20m',                                    // 單個日志文件最大20MB
        maxFiles: '14d'                                    // 保留14天內的日志
    });
    
    const logger = winston.createLogger({
        level: 'info',
        format: winston.format.combine(
            winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
            winston.format.json()                          // JSON格式日志(便于后續分析)
        ),
        transports: [transport]
    });
    
    module.exports = logger;
    
  • pino + pino-rotate
    安裝依賴:npm install pino pino-rotate。
    配置示例:
    const pino = require('pino');
    const rotate = require('pino-rotate');
    
    const logger = pino({
        level: 'info'
    });
    
    rotate({
        period: '1d',       // 每天輪轉一次
        path: '/path/to/logs', // 日志目錄
        maxFiles: 7,        // 保留7個日志文件
        gzip: true          // 壓縮舊日志
    })(logger);
    
    logger.info('Application started');
    

3. 使用cron定時任務(手動清理)

若不想依賴第三方工具,可通過cron定時執行shell腳本清理舊日志,適合簡單場景。

  • 創建清理腳本
    新建/usr/local/bin/clean-nodejs-logs.sh,內容如下:
    #!/bin/bash
    LOG_DIR="/path/to/your/nodejs/logs"
    find "$LOG_DIR" -type f -name "*.log" -mtime +7 -exec rm -f {} \; # 刪除7天前的.log文件
    
  • 賦予執行權限
    sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh。
  • 設置cron定時任務
    運行crontab -e,添加以下內容(每天凌晨0點執行):
    0 0 * * * /usr/local/bin/clean-nodejs-logs.sh
    

4. 使用systemd定時任務(集成服務管理)

若應用通過systemd管理(如nodejs.service),可創建systemd定時器與服務來清理日志,適合容器化或服務化部署。

  • 創建清理腳本
    同cron方式的clean-nodejs-logs.sh腳本。
  • 創建systemd服務文件
    新建/etc/systemd/system/clean-nodejs-logs.service,內容如下:
    [Unit]
    Description=Clean Node.js logs older than 7 days
    
    [Service]
    ExecStart=/usr/local/bin/clean-nodejs-logs.sh
    
  • 創建systemd定時器文件
    新建/etc/systemd/system/clean-nodejs-logs.timer,內容如下:
    [Unit]
    Description=Run clean-nodejs-logs daily
    
    [Timer]
    OnCalendar=daily
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    
  • 激活并啟動定時任務
    sudo systemctl daemon-reload
    sudo systemctl enable clean-nodejs-logs.timer
    sudo systemctl start clean-nodejs-logs.timer
    

5. 使用pm2內置日志管理(進程管理集成)

若使用pm2管理Node.js應用,可通過pm2的內置功能實現日志輪轉,無需額外配置工具。

  • 配置日志輪轉
    運行pm2 set pm2:log_rotate true開啟全局日志輪轉,或通過ecosystem.config.js文件自定義:
    module.exports = {
        apps: [{
            name: 'my-app',
            script: 'app.js',
            out_file: '/path/to/logs/out.log',
            error_file: '/path/to/logs/err.log',
            log_date_format: 'YYYY-MM-DD HH:mm Z',
            max_size: '10M',    // 單個日志文件最大10MB
            retain: 7           // 保留7個日志文件
        }]
    };
    
  • 重載pm2配置
    修改配置后運行pm2 reload ecosystem.config.js使設置生效。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女