溫馨提示×

Ubuntu Node.js日志如何實現自動化處理

小樊
53
2025-09-22 14:00:51
欄目: 編程語言

Ubuntu下Node.js日志自動化處理的核心方案

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

logrotate是Ubuntu系統自帶的日志管理工具,可自動完成日志輪轉、壓縮、清理等操作,是處理Node.js日志的基礎方案。

  • 安裝logrotate:若未安裝,通過sudo apt-get install logrotate命令安裝(Ubuntu默認已預裝)。
  • 創建Node.js專用配置文件:在/etc/logrotate.d/目錄下新建nodejs文件(如sudo nano /etc/logrotate.d/nodejs),添加以下配置(根據實際路徑調整):
    /path/to/your/nodejs/logs/*.log {
        daily                  # 每天輪轉一次(可選:weekly/monthly)
        rotate 7               # 保留最近7個輪轉日志(避免無限堆積)
        compress               # 使用gzip壓縮舊日志(節省空間)
        delaycompress          # 延遲壓縮(如第8個日志才壓縮第1個,減少IO壓力)
        missingok              # 若日志文件不存在,不報錯繼續執行
        notifempty             # 若日志為空,不進行輪轉
        create 0640 root adm   # 輪轉后創建新日志文件,權限0640,屬主root、屬組adm
    }
    
  • 測試與生效:手動觸發輪轉測試配置是否正確(sudo logrotate -f /etc/logrotate.d/nodejs);logrotate默認通過/etc/cron.daily/logrotate每日自動執行,無需額外配置。

2. 利用pm2的內置日志管理(適合pm2部署的應用)

若使用pm2管理Node.js進程,其內置的日志模塊可直接實現日志輪轉,無需額外工具。

  • 安裝與啟動pm2:通過sudo npm install pm2 -g全局安裝pm2,啟動應用時指定日志路徑:
    pm2 start app.js --name "my-app" \
      --out-file /var/log/nodejs/my-app-out.log \  # 標準輸出日志路徑
      --error-file /var/log/nodejs/my-app-err.log  # 錯誤輸出日志路徑
    
  • 配置日志輪轉:通過pm2 set pm2:logrotate命令或創建ecosystem.config.js文件設置輪轉參數。例如,在ecosystem.config.js中添加:
    module.exports = {
      apps: [{
        name: 'my-app',
        script: 'app.js',
        out_file: '/var/log/nodejs/my-app-out.log',
        error_file: '/var/log/nodejs/my-app-err.log',
        log_date_format: 'YYYY-MM-DD HH:mm Z',     // 日志時間格式
        time: true,                                // 在日志中添加時間戳
        merge_logs: true,                          // 合并stdout/stderr
        max_size: '10M',                           // 單個日志文件最大10MB
        max_files: 7                               // 保留7個歷史日志文件
      }]
    };
    
    啟動應用時加載配置:pm2 start ecosystem.config.js。

3. 結合rsyslog/syslog-ng集中收集(分布式場景)

對于多服務器部署的Node.js應用,可通過rsyslog/syslog-ng將日志集中收集到一臺服務器,便于統一管理。

  • 安裝rsyslogsudo apt-get install rsyslog(Ubuntu默認已安裝)。
  • 配置rsyslog收集Node.js日志:編輯/etc/rsyslog.d/50-nodejs.conf(新建文件),添加以下內容(將Node.js日志轉發到指定文件):
    if $programname == 'node' then /var/log/nodejs/nodejs.log
    & stop  # 停止后續規則處理,避免重復記錄
    
  • 重啟rsyslog服務sudo systemctl restart rsyslog,使配置生效。此時Node.js的標準輸出/錯誤日志會被rsyslog捕獲到/var/log/nodejs/nodejs.log,再結合logrotate對該文件進行輪轉即可。

4. 第三方日志管理工具(高級分析與可視化)

對于需要深度分析、可視化或長期存儲的場景,可使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog等工具。

  • ELK Stack配置示例
    • 安裝組件:通過sudo apt-get install elasticsearch logstash kibana安裝(需調整Java版本以滿足要求)。
    • 配置Logstash收集Node.js日志:創建/etc/logstash/conf.d/nodejs.conf,內容如下:
      input {
        file {
          path => "/var/log/nodejs/*.log"           # 日志文件路徑
          start_position => "beginning"             # 從文件開頭讀?。ㄊ状闻渲脮r需開啟)
          sincedb_path => "/dev/null"               # 忽略sincedb文件(測試用)
        }
      }
      filter {
        # 可選:添加過濾器解析日志(如grok解析JSON格式)
        grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:logmessage}" } }
        date { match => [ "timestamp", "ISO8601" ] }  # 轉換時間格式
      }
      output {
        elasticsearch { hosts => ["localhost:9200"] }  # 發送到Elasticsearch
        stdout { codec => rubydebug }                 # 控制臺輸出(測試用)
      }
      
    • 啟動服務sudo systemctl start elasticsearch logstash kibana,通過http://localhost:5601訪問Kibana,創建索引模式(如nodejs-*)即可可視化日志。

5. 自動化清理舊日志(補充方案)

除了logrotate的rotate參數,還可通過cron定時任務或Node.js腳本定期清理過期日志(如超過30天的日志)。

  • cron定時任務:編輯當前用戶的crontab(crontab -e),添加以下內容(每天凌晨1點刪除7天前的.log文件):
    0 1 * * * find /path/to/your/nodejs/logs -type f -name "*.log" -mtime +7 -exec rm -f {} \;
    
  • Node.js腳本清理:創建clean_logs.js,內容如下:
    const fs = require('fs');
    const path = require('path');
    const logDir = '/path/to/your/nodejs/logs';
    const maxAge = 7 * 24 * 60 * 60 * 1000; // 7天的毫秒數
    
    fs.readdir(logDir, (err, files) => {
      if (err) throw err;
      files.forEach(file => {
        const filePath = path.join(logDir, file);
        fs.stat(filePath, (err, stats) => {
          if (err) throw err;
          if (stats.isFile() && Date.now() - stats.mtime > maxAge) {
            fs.unlink(filePath, err => {
              if (err) throw err;
              console.log(`Deleted: ${filePath}`);
            });
          }
        });
      });
    });
    
    通過cron執行該腳本(0 2 * * * /usr/bin/node /path/to/clean_logs.js)。

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