温馨提示×

Ubuntu Node.js日志清理技巧

小樊
44
2025-10-28 15:48:18
栏目: 编程语言

使用logrotate工具(系统级自动化管理)
logrotate是Ubuntu系统自带的日志管理工具,可自动轮转、压缩、删除Node.js日志文件,无需修改应用代码。

  • 安装logrotate:若未安装,通过终端执行sudo apt-get install logrotate安装。
  • 创建配置文件:在/etc/logrotate.d/目录下新建Node.js专属配置文件(如nodejs-app),添加以下内容(根据实际路径调整):
    /path/to/your/nodejs/app/logs/*.log {
        daily                # 每天轮转一次
        rotate 7             # 保留最近7天的日志
        compress             # 压缩旧日志(节省空间)
        missingok            # 日志文件不存在时不报错
        notifempty           # 日志为空时不轮转
        create 0640 root adm # 新日志文件权限及所有者
    }
    
  • 手动触发测试:执行sudo logrotate -f /etc/logrotate.d/nodejs-app强制轮转,验证配置是否生效。
  • 自动化运行:logrotate默认通过/etc/cron.daily/logrotate每日自动执行,无需额外配置。

编写自定义Shell脚本(灵活定制清理逻辑)
通过Shell脚本可灵活定义清理规则(如按修改时间、文件大小),适合需要特殊清理逻辑的场景。

  • 基础脚本示例:创建clean-nodejs-logs.sh,内容如下:
    #!/bin/bash
    LOG_DIR="/path/to/your/nodejs/app/logs"
    MAX_DAYS=7  # 保留最近7天的日志
    find "$LOG_DIR" -type f -name "*.log" -mtime +$MAX_DAYS -exec rm -f {} \;  # 删除超过MAX_DAYS天的.log文件
    
  • 赋予执行权限sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh
  • 设置定时任务:通过crontab -e添加以下内容,实现每天凌晨1点自动清理:
    0 1 * * * /usr/local/bin/clean-nodejs-logs.sh
    

利用systemd定时任务(集成系统服务管理)
若Node.js应用通过systemd管理(如使用systemctl start node-app),可创建systemd定时任务实现日志清理。

  • 创建清理脚本:同自定义Shell脚本步骤,创建/usr/local/bin/clean-nodejs-logs.sh并赋予执行权限。
  • 创建systemd服务文件sudo nano /etc/systemd/system/clean-nodejs-logs.service,内容如下:
    [Unit]
    Description=Clean Node.js logs older than 7 days
    [Service]
    ExecStart=/usr/local/bin/clean-nodejs-logs.sh
    
  • 创建systemd定时器文件sudo nano /etc/systemd/system/clean-nodejs-logs.timer,内容如下:
    [Unit]
    Description=Run clean-nodejs-logs daily
    [Timer]
    OnCalendar=daily
    Persistent=true
    [Install]
    WantedBy=timers.target
    
  • 激活定时任务:执行sudo systemctl daemon-reloadsudo systemctl enable clean-nodejs-logs.timersudo systemctl start clean-nodejs-logs.timer,定时任务将随系统启动自动运行。

使用Node.js第三方日志库(应用层集成轮转)
通过第三方日志库(如winston-daily-rotate-file)在应用层实现日志轮转,适合需要与应用深度集成的场景(如按日志级别分开轮转)。

  • 安装库npm install winston-daily-rotate-file
  • 配置日志轮转:在应用代码中添加以下内容(以winston为例):
    const winston = require('winston');
    const DailyRotateFile = require('winston-daily-rotate-file');
    const logger = winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        transports: [
            new DailyRotateFile({
                filename: '/path/to/your/nodejs/app/logs/app-%DATE%.log',  // 日志文件名格式
                datePattern: 'YYYY-MM-DD',  // 按天分割
                zippedArchive: true,        // 压缩旧日志
                maxSize: '20m',             // 单个日志文件最大20MB
                maxFiles: '14d'             // 保留最近14天的日志
            })
        ]
    });
    logger.info('This log will be rotated daily and compressed.');
    
    此配置会自动按天分割日志文件,压缩旧日志并保留14天,无需额外系统级配置。

手动清理临时日志(快速释放空间)
若需立即释放磁盘空间,可通过手动命令删除指定目录下的日志文件(谨慎使用,避免误删正在使用的日志)。

  • 进入日志目录cd /path/to/your/nodejs/app/logs
  • 删除所有.log文件rm -f *.log(强制删除所有.log文件)。
  • 删除超过30天的日志find . -type f -name "*.log" -mtime +30 -exec rm -f {} \;(删除30天前的.log文件)。
    手动清理后,建议后续配置自动清理策略,避免重复操作。

0