温馨提示×

Ubuntu下Node日志清理方法

小樊
43
2025-12-21 20:29:09
栏目: 智能运维

Ubuntu下Node日志清理方法

一 常用方案总览

  • 使用系统自带的logrotate做按天/按大小轮转并自动清理旧文件,适合绝大多数场景。
  • 使用cronsystemd timer定期执行清理脚本,灵活控制保留天数与路径。
  • 在应用内使用日志库的按日/按大小轮转能力(如winston-daily-rotate-filepino-rotate),与应用生命周期绑定。
  • 若你的Node应用由systemd托管,也可将stdout/stderr接入journald,再用journald的保留策略清理系统日志。

二 使用logrotate进行自动轮转与清理

  • 安装与放置配置(通常已预装logrotate):
    • sudo apt-get update && sudo apt-get install -y logrotate
    • 新建配置:sudo nano /etc/logrotate.d/nodejs-app
  • 示例配置(按天轮转、保留7天、压缩、自动重建日志文件):
    • /path/to/your/nodejs/app/logs/*.log { daily missingok rotate 7 compress notifempty create 0640 root adm }
  • 关键参数说明:
    • daily/weekly/monthly:轮转周期;可叠加size 100M按大小触发。
    • rotate N:保留最近N个归档。
    • compress:gzip压缩旧日志。
    • missingok/notifempty:文件缺失或为空时不报错/不轮转。
    • create 0640 root adm:轮转后新建文件的权限与属主属组。
    • 如需“轮转后通知应用重新打开日志”,可在postrotate中执行:killall -USR1 node 或 systemctl reload your-app。
  • 测试与生效:
    • 手动触发:sudo logrotate -f /etc/logrotate.d/nodejs-app
    • 查看状态:cat /var/lib/logrotate/status
    • 默认由**/etc/cron.daily/logrotate**每日执行,无需额外cron。

三 使用cron或systemd timer定期清理

  • 简单Bash脚本清理超过N天的.log文件:
    • sudo nano /usr/local/bin/clean-nodejs-logs.sh
    • 内容:
      • #!/bin/bash LOG_DIR=“/path/to/your/nodejs/app/logs” DAYS_TO_KEEP=7 find “$LOG_DIR” -type f -name “*.log” -mtime +“$DAYS_TO_KEEP” -delete
    • 赋权:sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh
  • 方式A(cron):
    • crontab -e 加入:0 1 * * * /usr/local/bin/clean-nodejs-logs.sh
  • 方式B(systemd timer,更现代):
    • /etc/systemd/system/clean-nodejs-logs.timer
      • [Unit] Description=Clean Node.js logs older than 7 days [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target
    • /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
    • 启用:
      • sudo systemctl daemon-reload
      • sudo systemctl enable --now clean-nodejs-logs.timer
      • 查看状态:systemctl list-timers

四 在Node.js应用内做日志轮转

  • 使用winston + winston-daily-rotate-file
    • 安装:npm i 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’, zippedArchive: true, maxSize: ‘20m’, maxFiles: ‘14d’ }) ] });
  • 使用pino + pino-rotate(按日轮转示例):
    • 安装:npm i pino pino-rotate
    • 示例:
      • const pino = require(‘pino’); const rotate = require(‘pino-rotate’); rotate({ period: ‘1d’, path: ‘/path/to/your/nodejs/app/logs’, maxFiles: 7, gzip: true }); const logger = pino({ level: ‘info’ }, rotate());
  • 适用场景:容器化/多实例部署、希望与应用生命周期一致、无需外部依赖。

五 易混淆日志与注意事项

  • 区分日志来源:
    • 应用日志:位于你的应用目录(如**/var/log/yourapp/或项目内logs/**),用上文方法清理。
    • 系统日志:由journald管理(如服务stdout/stderr被接入journal)。清理命令示例:
      • 按大小:sudo journalctl --vacuum-size=1G
      • 按时间:sudo journalctl --vacuum-time=3d
  • 安全与权限:
    • 清理脚本与logrotate配置中的create权限应与应用运行用户匹配,避免日志写入失败。
    • 删除前建议先备份或先移动到临时目录观察一段时间。
  • 避免误删:
    • 使用find时精确匹配(如-name “*.log”),避免匹配到压缩包或其他重要文件。
  • 验证与观测:
    • 观察轮转是否生效:ls -lh /path/to/logs;查看logrotate状态:cat /var/lib/logrotate/status
    • 若接入journald,用journalctl -u your-app查看服务日志是否正常输出。

0