温馨提示×

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

小樊
38
2025-11-23 14:46:05
栏目: 编程语言

Linux Node.js 日志清理策略

一 常用策略总览

  • logrotate 系统级轮转:由操作系统按计划对日志进行按日/按大小轮转、压缩保留N份缺失不报错空文件不轮转等,适合绝大多数场景,稳定可靠。
  • Node.js 日志库内置轮转:在应用内用 winston + winston-daily-rotate-filepino 等实现按时间/大小自动切割与归档,便于与业务代码同生命周期管理。
  • PM2 内置/插件轮转:使用 pm2-logrotate 插件或 ecosystem 配置,对 PM2 托管的应用统一设置最大文件大小保留份数压缩定时策略。
  • systemd 日志:将应用输出接入 journald,由 systemd-journald 负责日志轮转与保留;也可配合 rsyslog 写入文件后再用 logrotate 管理。
  • 定时任务 cron:用 find … -mtime +N -delete 定期清理历史日志,简单直接,适合“兜底清理”。

二 配置示例

  • logrotate 示例
    • 新建配置:/etc/logrotate.d/node-app
    • 配置内容:
      /var/log/node-app/*.log {
          daily
          rotate 7
          compress
          delaycompress
          missingok
          notifempty
          create 0640 root adm
          copytruncate
          dateext
      }
      
    • 说明:按天轮转、保留7份、压缩旧日志、延迟压缩、缺失不报错、空文件不轮转、轮转后复制并截断原文件以保持文件句柄、使用日期后缀;测试命令:sudo logrotate -f /etc/logrotate.d/node-app
  • Node.js 日志库示例(winston)
    • 安装:npm i winston winston-daily-rotate-file
    • 配置:
      const winston = require('winston');
      const DailyRotateFile = require('winston-daily-rotate-file');
      
      const transport = new DailyRotateFile({
        filename: '/var/log/node-app/application-%DATE%.log',
        datePattern: 'YYYY-MM-DD-HH',
        zippedArchive: true,
        maxSize: '20m',
        maxFiles: '14d'
      });
      
      const logger = winston.createLogger({
        level: 'info',
        format: winston.format.json(),
        transports: [transport]
      });
      
  • PM2 日志轮转示例
    • 安装插件:pm2 install pm2-logrotate
    • 配置策略:
      pm2 set pm2-logrotate:max_size 10M
      pm2 set pm2-logrotate:retain 7
      pm2 set pm2-logrotate:compress true
      pm2 set pm2-logrotate:rotateInterval "0 0 * * *"
      pm2 restart all
      
  • systemd 与 rsyslog 示例
    • 服务文件片段(输出到文件):
      [Service]
      ExecStart=/usr/bin/node /path/to/app.js
      StandardOutput=append:/var/log/node-app/stdout.log
      StandardError=append:/var/log/node-app/stderr.log
      SyslogIdentifier=node-app
      
    • 如需写入 syslog,可在 rsyslog 配置中按程序名路由,再交由 logrotate 管理:if $programname == 'node-app' then /var/log/node-app.log & stop;重启服务:sudo systemctl daemon-reload && sudo systemctl restart node-app
  • cron 兜底清理示例
    • 每天清理 7 天前 .log 文件:0 0 * * * find /var/log/node-app -type f -name "*.log" -mtime +7 -delete
    • 或放入脚本后定时执行:0 1 * * * /opt/scripts/clean_logs.sh

三 选型与组合建议

  • 单一应用且无特殊需求:优先用 logrotate,配置简单、运维成本低、与系统生态集成好。
  • 需要按小时/大小精细控制或与应用行为联动:在代码里用 winston/pino应用内轮转
  • 使用 PM2 部署:直接用 pm2-logrotate,统一托管进程与日志策略。
  • 已接入 journald:优先用 systemd-journald 保留与轮转;若需落盘再由 logrotate 管理。
  • 任何方案都建议加一层 cron 兜底清理,防止异常情况下日志无限增长。

四 关键注意事项

  • 避免误删:清理前先备份关键日志;删除策略建议以时间/大小阈值为主,先试运行或先列出匹配文件再删除(如 find ... -mtime +7 -print)。
  • 文件句柄与可用性:选择 copytruncate 可避免重启应用,但在高并发写入下可能有短暂丢日志风险;若应用支持重新打开日志文件(如信号或日志库接口),优先采用轮转后通知应用重开的方式。
  • 权限与安全:确保日志目录与文件的属主/权限正确(如 0640 root adm),避免被非授权用户读取或篡改。
  • 压缩与保留策略:开启 compress 节省空间;rotate 7 / maxFiles 14d 等值需结合磁盘容量合规要求设定,并定期审计。
  • 监控与告警:对磁盘使用率日志增长速率设置监控告警,提前发现异常。

0