1. 使用系统级工具logrotate配置自动轮转
logrotate是Debian系统自带的日志管理工具,可定期切割、压缩和删除旧日志,避免单个文件过大。操作步骤如下:
sudo apt-get install logrotatesudo nano /etc/logrotate.d/nodejs-app/path/to/your/nodejs/logs/*.log {
daily # 每日轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志(节省空间)
delaycompress # 延迟1天压缩最新日志(避免影响当前日志写入)
missingok # 忽略不存在的日志文件(避免报错)
notifempty # 空日志不处理(减少不必要的操作)
create 0640 www-data www-data # 新日志文件权限与属主(根据实际用户调整)
sharedscripts # 所有日志处理完成后执行脚本
postrotate
# 若使用pm2管理进程,需通知其重新打开日志文件
# pm2 reload logs
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs-app(模拟运行,不实际修改文件);sudo logrotate -f /etc/logrotate.d/nodejs-app(强制执行轮转)。2. 通过PM2内置插件实现日志轮转
若使用PM2管理Node.js进程,可借助pm2-logrotate插件快速配置轮转:
pm2 install pm2-logrotatepm2 conf(显示当前轮转参数)pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 每日凌晨执行轮转(cron语法)
pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB
pm2 set pm2-logrotate:retain 7 # 保留7天旧日志
pm2 set pm2-logrotate:compress true # 启用压缩
此方法与PM2深度集成,适合已用PM2管理进程的场景。
3. 使用Node.js日志库内置轮转功能
通过Winston、Pino等日志库的内置模块实现轮转,适合需要定制化日志格式或逻辑的应用:
npm install winston winston-daily-rotate-fileconst 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/logs/application-%DATE%.log', // 日志文件名模板(%DATE%替换为日期)
datePattern: 'YYYY-MM-DD', // 日期格式
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天日志
})
]
});
// 测试日志输出
logger.info('This is a rotated log message.');
pino-rotating-file插件扩展:npm install pino pino-rotating-file
配置logger:const pino = require('pino');
const rotatingFile = require('pino-rotating-file');
const logger = pino({
level: 'info',
transport: {
target: 'pino-rotating-file',
options: {
destination: '/path/to/logs/application.log',
maxSize: '10m',
maxFiles: 7
}
}
});
logger.info('This is a pino rotated log message.');
此方法适合需要深度定制日志(如结构化日志、多传输目标)的应用。
4. 控制日志级别减少不必要的输出
根据环境调整日志级别,避免记录过多调试信息:
warn或error,仅记录重要事件;debug,便于排查问题。const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug', // 根据环境变量动态设置
format: winston.format.json(),
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
此方法可从源头减少日志量,适合所有场景。
5. 定期清理旧日志(补充手段)
若无法使用轮转工具,可通过脚本定期删除旧日志:
cleanup_logs.sh):#!/bin/bash
LOG_DIR="/path/to/your/nodejs/logs"
find "$LOG_DIR" -type f -name "*.log" -mtime +30 -exec rm -f {} \; # 删除30天前的.log文件
chmod +x cleanup_logs.shcrontab -e
添加以下内容:0 0 * * * /path/to/cleanup_logs.sh
此方法适合临时或简单场景。