温馨提示×

Debian系统Node.js日志清理方法

小樊
46
2025-11-14 18:42:13
栏目: 编程语言

Debian系统Node.js日志清理方法

一 常用方法概览

  • 手动清理:定位日志文件后删除或备份,适合临时处理或首次排查。
  • logrotate系统轮转:Debian自带工具,按时间/大小自动轮转、压缩、清理,适合生产环境长期治理。
  • Node.js日志库轮转:在应用内用如winston、pino、bunyan配置按大小或按日期轮转,便于与进程生命周期绑定。
  • 定时任务脚本:用cron或Node脚本定期删除过期日志,作为兜底或简单场景使用。

二 手动清理步骤

  • 定位日志路径:常见在**/var/log/或应用目录(如/opt/nodeapp/)下的app.log、access.log、error.log**等。
  • 备份与清理:
    • 备份示例:sudo cp /path/to/app.log /path/to/backup/app.log.bak
    • 删除示例:sudo rm /path/to/app.log
  • 安全建议:清理前先确认日志不再被写入;清理后通知应用重新打开日志文件(如重启服务或发送信号)。

三 使用logrotate系统轮转

  • 安装与准备:Debian通常自带logrotate,如需安装:sudo apt-get update && sudo apt-get install logrotate
  • 创建配置:新建**/etc/logrotate.d/nodejs**,示例(按天轮转、保留7天、压缩、忽略缺失、空文件不轮转、自动创建新文件):
    /var/log/nodejs/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0640 root adm
    }
    
  • 测试与生效:
    • 语法/演练:sudo logrotate -d /etc/logrotate.d/nodejs
    • 强制执行一次:sudo logrotate -f /etc/logrotate.d/nodejs
  • 说明:logrotate由系统定时任务驱动,无需额外重启服务。

四 在Node.js中使用日志库轮转

  • 使用winston按大小轮转(示例:单文件10MB、最多10个备份):
    const winston = require('winston');
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({
          filename: '/var/log/nodejs/app.log',
          maxsize: 10 * 1024 * 1024, // 10MB
          maxFiles: 10
        })
      ]
    });
    if (process.env.NODE_ENV !== 'production') {
      logger.add(new winston.transports.Console({ format: winston.format.simple() }));
    }
    
  • 使用winston-daily-rotate-file按日期轮转(示例:按日、压缩、保留14天):
    const winston = require('winston');
    const DailyRotateFile = require('winston-daily-rotate-file');
    const logger = winston.createLogger({
      level: 'info',
      transports: [
        new DailyRotateFile({
          filename: '/var/log/nodejs/app-%DATE%.log',
          datePattern: 'YYYY-MM-DD',
          zippedArchive: true,
          maxSize: '20m',
          maxFiles: '14d'
        })
      ]
    });
    
  • 提示:按日期命名时,日志清理由库自动处理;按大小命名时,结合maxFiles控制保留数量。

五 使用cron或脚本兜底清理

  • cron定时删除(示例:每天1:00删除7天前的.log文件):
    0 1 * * * find /path/to/nodejs/logs -type f -name "*.log" -mtime +7 -exec rm {} \;
    
  • Node.js清理脚本(示例:删除7天前日志):
    const fs = require('fs').promises;
    const path = require('path');
    const logsDir = '/path/to/nodejs/logs';
    const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
    
    (async () => {
      const files = await fs.readdir(logsDir);
      for (const f of files) {
        const fp = path.join(logsDir, f);
        const st = await fs.stat(fp);
        if (st.isFile() && st.mtimeMs < cutoff) await fs.unlink(fp);
      }
    })().catch(console.error);
    
  • 建议:将脚本加入cron定时执行,作为系统轮转或库轮转失效时的兜底方案。

0