温馨提示×

Linux Node.js日志切割策略

小樊
57
2025-09-19 20:42:38
栏目: 编程语言

Linux环境下Node.js日志切割的常见策略及实现方法

在Linux系统中,Node.js应用的日志文件若无限增长,会占用大量磁盘空间并影响系统性能。合理的日志切割策略能有效管理日志生命周期,提升可维护性。以下是几种主流的日志切割方案:

1. 使用logrotate工具(系统自带)

logrotate是Linux系统自带的日志管理工具,支持按时间/大小切割、压缩、删除旧日志,适用于大多数场景。
配置示例:创建/etc/logrotate.d/myapp文件,内容如下:

/var/log/myapp.log {
    daily                # 每天切割一次(可选:weekly/monthly)
    rotate 7             # 保留最近7天的日志
    compress             # 压缩旧日志(gzip格式)
    delaycompress        # 延迟压缩(如第7天日志不压缩,第8天压缩第7天日志)
    missingok            # 日志文件不存在时不报错
    notifempty           # 日志为空时不切割
    create 640 root adm  # 切割后创建新日志,权限640,属主root,属组adm
}

手动触发测试sudo logrotate -f /etc/logrotate.d/myapp(强制立即执行)。

2. 使用pm2-logrotate插件(配合PM2)

若使用PM2管理Node.js应用,pm2-logrotate是其专用日志分割插件,无需额外安装系统工具。
安装与配置

pm2 install pm2-logrotate          # 安装插件
pm2 set pm2-logrotate:max_size 1G  # 单个日志文件最大1GB(超过则切割)
pm2 set pm2-logrotate:retain 30    # 保留最近30个日志文件
pm2 set pm2-logrotate:compress true  # 压缩旧日志
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'  # 每天凌晨0点执行

特点:与PM2深度集成,支持动态配置,适合PM2管理的应用。

3. 使用Winston的DailyRotateFile传输(Node.js日志库)

Winston是Node.js流行的日志库,其winston-daily-rotate-file传输插件可实现高级日志分割。
配置示例

const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = winston.createLogger({
  transports: [
    new DailyRotateFile({
      filename: 'logs/application-%DATE%.log',  // 日志文件名(含日期占位符)
      datePattern: 'YYYY-MM-DD',                // 日期格式(切割后文件名为application-2025-09-19.log)
      zippedArchive: true,                      // 压缩旧日志(gzip)
      maxSize: '20m',                           // 单个文件最大20MB
      maxFiles: '14d',                          // 保留最近14天的日志
      dirname: '/var/log/myapp'                 // 日志存储目录
    })
  ]
});

优势:灵活支持多种传输方式(文件、数据库、远程服务等),适合需要定制化日志的场景。

4. 使用Pino的Rotate传输(高性能场景)

Pino是Node.js高性能日志库,pino-rotate插件可为其添加日志分割功能,适合对性能要求高的应用。
配置示例

const pino = require('pino');
const { createLogger } = require('pino-rotate');

const logger = createLogger({
  level: 'info',
  transport: {
    target: 'pino-pretty',  // 可选:美化日志输出
    options: { colorize: true }
  },
  interval: '1d',           // 每天切割一次(可选:1h/1m)
  path: '/var/log/myapp.log', // 日志文件路径
  maxsize: '50m',           // 单个文件最大50MB
  gzip: true,               // 压缩旧日志
  retainDays: 7             // 保留最近7天的日志
});

特点:低开销、高吞吐量,适合大规模分布式系统。

5. 自定义Shell脚本+定时任务(灵活但需维护)

若需要完全自定义的切割逻辑(如按特定行数、业务标识分割),可编写Shell脚本并通过cron定时执行。
脚本示例(按大小切割并压缩):

#!/bin/bash
LOG_DIR="/var/log/myapp"
BACKUP_DIR="$LOG_DIR/backup"
LOG_FILE="$LOG_DIR/application.log"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 切割日志(按大小100MB)
if [ -f "$LOG_FILE" ]; then
  mv "$LOG_FILE" "$BACKUP_DIR/application-$(date +%Y%m%d%H%M%S).log"
fi

# 压缩旧日志
gzip "$BACKUP_DIR/application-*.log"

# 清理7天前的日志
find "$BACKUP_DIR" -name "application-*.gz" -mtime +7 -exec rm {} \;

# 重新创建空日志文件
touch "$LOG_FILE"

定时任务配置:通过crontab -e添加以下行,每天凌晨2点执行:

0 2 * * * /path/to/log_rotate.sh

适用场景:需要特殊分割逻辑(如按业务模块分割)的非标准场景。

最佳实践建议

  • 优先选择工具:普通场景用logrotate(系统自带,无需额外依赖);PM2管理应用用pm2-logrotate(集成方便);需要高级功能(如结构化日志)用winston-daily-rotate-filepino-rotate
  • 日志分级:结合日志级别(info/warn/error)分割不同类型的日志(如error.log单独存储),便于故障排查。
  • 压缩与保留策略:启用压缩(节省空间),根据日志重要性设置保留天数(如error日志保留30天,普通日志保留7天)。
  • 监控与告警:定期检查日志切割状态(如logrotate的日志/var/lib/logrotate/status),设置磁盘空间告警(如使用df -h监控/var/log分区)。

0