Linux环境下Node.js日志切割的常见策略及实现方法
在Linux系统中,Node.js应用的日志文件若无限增长,会占用大量磁盘空间并影响系统性能。合理的日志切割策略能有效管理日志生命周期,提升可维护性。以下是几种主流的日志切割方案:
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(强制立即执行)。
若使用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管理的应用。
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' // 日志存储目录
})
]
});
优势:灵活支持多种传输方式(文件、数据库、远程服务等),适合需要定制化日志的场景。
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天的日志
});
特点:低开销、高吞吐量,适合大规模分布式系统。
若需要完全自定义的切割逻辑(如按特定行数、业务标识分割),可编写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-file或pino-rotate。error.log单独存储),便于故障排查。logrotate的日志/var/lib/logrotate/status),设置磁盘空间告警(如使用df -h监控/var/log分区)。