温馨提示×

Ubuntu Node.js日志如何实现自动化处理

小樊
68
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"             # 从文件开头读取(首次配置时需开启)
          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