温馨提示×

Ubuntu Node.js日志清理策略有哪些

小樊
44
2025-12-10 00:00:38
栏目: 编程语言

Ubuntu Node.js 日志清理策略

一 系统级策略

  • 使用 logrotate 对应用日志进行按日/按大小轮转、压缩与保留,适合绝大多数场景。示例配置(/etc/logrotate.d/nodejs):
    /path/to/your/nodejs/app/logs/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0640 your_user your_group
    }
    
    要点:
    • daily/rotate 7/compress:每天轮转、保留最近 7 天、旧日志压缩。
    • missingok/notifempty:日志缺失不报错、空文件不轮转。
    • create 0640 your_user your_group:轮转后重建文件并设定权限与属主,务必使用运行应用的 实际用户/组,避免权限错误。
    • 测试与生效:sudo logrotate -f /etc/logrotate.d/nodejs;通常系统每日由 cron 自动调用 logrotate,无需额外操作。
  • 若服务由 systemd 托管,清理系统日志(journald)避免与业务日志混淆:
    sudo journalctl --vacuum-time 3d
    sudo journalctl --vacuum-size 500M
    
    建议仅清理系统级 journal,业务日志仍交由应用或 logrotate 管理。

二 应用内策略

  • 使用 winston + winston-daily-rotate-file 在代码中实现按日/按大小轮转与保留:
    const winston = require('winston');
    const DailyRotateFile = require('winston-daily-rotate-file');
    
    const logger = winston.createLogger({
      level: 'info',
      transports: [
        new DailyRotateFile({
          filename: '/path/to/your/nodejs/app/logs/app-%DATE%.log',
          datePattern: 'YYYY-MM-DD-HH',
          zippedArchive: true,
          maxSize: '20m',
          maxFiles: '14d'
        })
      ]
    });
    
    要点:
    • datePattern:按小时/天命名归档。
    • zippedArchive:旧日志压缩归档。
    • maxSize/maxFiles:控制单文件大小与保留天数,避免无限增长。
  • 使用 pino 生态的 pino-rotate 等插件实现类似能力(period、maxFiles、gzip 等参数可按需配置)。

三 进程管理工具策略

  • 使用 PM2 内置日志管理:
    • 快速清理当前应用日志缓冲:pm2 logs my-app --clear(仅清空缓冲,不删归档)。
    • 配置最大单个日志大小与保留数量(ecosystem.config.js):
      module.exports = {
        apps: [{
          name: 'my-app',
          script: 'app.js',
          out_file: '/path/to/your/nodejs/logs/out.log',
          error_file: '/path/to/your/nodejs/logs/err.log',
          log_date_format: 'YYYY-MM-DD HH:mm Z',
          max_size: '10M',
          retain: 7
        }]
      };
      
    • 说明:max_size 触发轮转,retain 控制保留份数;PM2 适合无侵入接入与快速运维。

四 脚本与定时任务策略

  • 编写 Node.js 清理脚本,按 mtime 删除过期日志并加入 cron 定期执行:
    // clean-old-logs.js
    const fs = require('fs');
    const path = require('path');
    const logsDir = '/path/to/your/nodejs/logs';
    const maxDays = 7;
    fs.readdir(logsDir, (err, files) => {
      if (err) return console.error(err);
      const now = Date.now();
      files.forEach(f => {
        fs.stat(path.join(logsDir, f), (e, s) => {
          if (e) return console.error(e);
          const age = (now - s.mtimeMs) / (1000 * 3600 * 24);
          if (age > maxDays) fs.unlink(path.join(logsDir, f), () => {});
        });
      });
    });
    
    • cron 示例(每天 01:00 清理 7 天前日志):0 1 * * * find /path/to/your/nodejs/logs -type f -name "*.log" -mtime +7 -delete
  • 也可使用 shell 脚本 + cron 的方式,按文件数量或时间策略删除旧日志,适合简单场景与统一运维规范。

五 策略选择与落地建议

  • 优先选择 应用内轮转(如 winston/pino)以获得更细粒度控制;在 systemd 环境下,业务日志与 journald 分离管理更清晰。
  • 统一权限与路径:logrotate 的 create 指令与 PM2 的日志路径,均应使用运行应用的 实际用户/组,避免写入失败或安全风险。
  • 避免误删:清理前先 备份 关键日志;对 journald 的清理仅限系统日志,业务日志交由应用或 logrotate 处理。
  • 监控与告警:对 磁盘使用率 设置阈值告警;定期验证 轮转与压缩 是否生效(如检查 .gz 文件是否生成、旧文件是否被删除)。

0