溫馨提示×

Ubuntu Nodejs 日志管理怎么做

小樊
51
2025-09-18 10:57:26
欄目: 編程語言

Ubuntu環境下Node.js日志管理方案

1. 基礎日志記錄:使用內置console模塊

Node.js內置的console模塊是最簡單的日志記錄方式,適合開發調試。通過console.log()輸出普通信息,console.error()輸出錯誤信息,日志會直接顯示在終端或重定向到文件(如node app.js > app.log 2>&1)。但這種方式缺乏日志級別、格式化和長期管理功能,僅適用于臨時調試。

2. 第三方日志庫:結構化與定制化

第三方日志庫提供了日志級別、格式化、傳輸(文件/控制臺/HTTP)等功能,適合生產環境:

  • Winston:最流行的日志庫,支持多傳輸方式(文件、控制臺、數據庫等)、日志級別(info/warn/error等)和自定義格式。示例配置:
    const winston = require('winston');
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(), // 結構化日志(便于后續分析)
      transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }), // 錯誤日志單獨存儲
        new winston.transports.File({ filename: 'combined.log' }), // 所有日志合并
        new winston.transports.Console({ format: winston.format.simple() }) // 控制臺輸出(開發環境)
      ]
    });
    logger.info('Application started'); // 記錄info日志
    
  • Bunyan:以結構化JSON日志為核心,便于日志聚合和分析。示例:
    const bunyan = require('bunyan');
    const logger = bunyan.createLogger({ name: 'myapp' }); // 日志名稱
    logger.info({ user: 'John' }, 'User logged in'); // 帶上下文的日志
    
  • Pino:主打高性能(比Winston快3倍以上),日志以JSON格式輸出,支持異步記錄。示例:
    const pino = require('pino')();
    pino.info('This is a log message'); // 自動添加時間戳、日志級別
    
  • Log4js:功能豐富,支持日志輪轉、多appender(文件、數據庫、郵件等),適合復雜應用。示例:
    const log4js = require('log4js');
    log4js.configure({
      appenders: {
        file: { type: 'file', filename: 'app.log', pattern: '-yyyy-MM-dd', keepFileExt: true }, // 按天輪轉
        console: { type: 'console' }
      },
      categories: { default: { appenders: ['file', 'console'], level: 'info' } }
    });
    const logger = log4js.getLogger();
    logger.info('Log4js is working');
    

這些庫均支持日志級別過濾(如僅記錄error及以上級別)、結構化日志(便于ELK等工具分析)和多傳輸目標(文件+控制臺+遠程服務器)。

3. 日志輪轉:防止日志文件過大

當日志文件過大時,需通過輪轉分割文件,避免占用過多磁盤空間。Ubuntu下常用logrotate工具:

  • 安裝:sudo apt-get install logrotate
  • 配置:創建/etc/logrotate.d/nodejs文件,添加以下內容(針對Node.js日志目錄):
    /var/log/nodejs/*.log {
      daily                # 每天輪轉
      missingok            # 日志文件不存在時不報錯
      rotate 7             # 保留最近7天的日志
      compress             # 壓縮舊日志(.gz格式)
      notifempty           # 日志為空時不輪轉
      create 0640 root adm # 新日志文件權限
    }
    
  • 測試:sudo logrotate -vf /etc/logrotate.d/nodejs(強制立即輪轉)。
    也可通過PM2內置輪轉(見下文)或日志庫自身功能(如Winston的winston-daily-rotate-file插件)實現。

4. 進程管理器:PM2的日志管理功能

PM2是Node.js進程管理工具,內置日志管理功能,適合生產環境:

  • 安裝:sudo npm install pm2 -g
  • 啟動應用并記錄日志:pm2 start app.js --name my-app(自動生成out.log(標準輸出)和err.log(錯誤輸出))
  • 常用命令:
    • pm2 logs my-app:實時查看日志(--lines 100限制行數,--follow持續跟蹤)
    • pm2 logs --json:以JSON格式輸出(便于后續處理)
    • pm2 flush:清空當前日志
  • 配置日志輪轉:通過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:ss', // 日志時間格式
        merge_logs: true, // 合并stdout和stderr
        log_rotation: true, // 開啟輪轉
        log_rotation_interval: '1d', // 每天輪轉
        log_rotation_size: '10M', // 單個文件超過10M時輪轉
        log_rotation_keep: 7 // 保留7個輪轉文件
      }]
    };
    
    啟動:pm2 start ecosystem.config.js。

5. 系統日志集成:rsyslog/syslog-ng

將Node.js日志發送到系統日志(/var/log/syslog/var/log/messages),統一管理:

  • 安裝rsyslog:sudo apt-get install rsyslog(Ubuntu默認安裝)
  • 配置:編輯/etc/rsyslog.d/50-default.conf,添加以下內容(將node程序的日志發送到/var/log/nodejs.log):
    if $programname == 'node' then /var/log/nodejs.log
    & stop # 停止后續處理(避免重復記錄)
    
  • 重啟rsyslog:sudo systemctl restart rsyslog
  • 查看日志:tail -f /var/log/nodejs.log。
    需在Node.js應用中配置日志傳輸(如Winston的transports.Consolewinston-syslog插件)。

6. 高級日志分析:ELK/Graylog等工具

對于大規模應用,可使用日志分析平臺實現集中存儲、可視化和告警:

  • ELK Stack(Elasticsearch+Logstash+Kibana)
    • Logstash收集Node.js日志(通過file input插件),Elasticsearch存儲并索引,Kibana可視化分析(如錯誤趨勢、請求耗時)。
    • 配置:需安裝Logstash的file input插件,解析JSON格式日志(Winston/Bunyan輸出的JSON可直接解析)。
  • Graylog
    • 開源日志管理平臺,支持日志收集(GELF格式)、存儲(MongoDB/Elasticsearch)、分析和告警(如錯誤率超過閾值時發送郵件)。
    • 配置:Node.js應用通過winston-graylog2bunyan-graylog插件發送GELF格式日志到Graylog服務器。
  • Loki+Grafana
    • 云原生日志聚合系統,輕量級(適合Kubernetes環境),與Grafana集成實現可視化。
    • 配置:使用promtail收集日志(支持Node.js JSON格式),發送到Loki,通過Grafana展示日志面板。

以上方案覆蓋了Ubuntu下Node.js日志管理的記錄、輪轉、進程管理、系統集成、分析全流程,可根據應用規模(開發/生產)、需求(簡單/復雜)選擇合適的組合(如開發用console+Winston,生產用PM2+logrotate+ELK)。

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