使用 logrotate 工具(系统级日志轮转)
logrotate 是 Ubuntu 系统自带的日志管理工具,可自动处理 Node.js 应用日志的轮转、压缩和清理,无需修改应用代码。
sudo apt-get update && sudo apt-get install logrotate
/etc/logrotate.d/ 目录下新建针对 Node.js 应用的配置文件(如 nodejs-app):sudo nano /etc/logrotate.d/nodejs-app
/path/to/your/nodejs/app/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
rotate 7 # 保留最近7个轮转文件
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(如第8个文件才压缩第1个)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件权限(属主root,属组adm)
sharedscripts # 多个日志文件匹配时,postrotate仅执行一次
postrotate
# 若应用由systemd管理,建议用systemctl重启(避免kill进程)
systemctl restart your-nodejs-app.service
# 若直接通过进程ID启动,可注释上方行,取消下方注释
# kill -HUP `cat /path/to/your/nodejs/app/pidfile`
endscript
}
sudo logrotate -f /etc/logrotate.d/nodejs-app
/etc/cron.daily/logrotate)每天自动执行,无需额外配置。使用 Winston + winston-daily-rotate-file(应用层日志轮转)
若需更灵活的控制(如按文件大小轮转、自定义日志格式),可使用 Winston 日志库结合 winston-daily-rotate-file 插件,实现应用内日志轮转。
npm install winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: '/path/to/your/logs/application-%DATE%.log', // 日志文件名(含日期占位符)
datePattern: 'YYYY-MM-DD', // 日期格式(每天一个文件)
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大大小(超过则轮转)
maxFiles: '14d', // 保留最近14天的日志
createSymlink: true, // 创建符号链接(指向最新日志)
symlinkName: 'current.log' // 符号链接名称
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
winston.format.json() // JSON格式输出
),
transports: [transport] // 使用轮转传输
});
// 测试日志
logger.info('This is a rotated log message.');
使用 Pino + pino-rotate(高性能日志轮转)
若应用对日志性能要求极高(如实时性强的微服务),可使用 Pino 日志库(Node.js 性能最高的日志库)结合 pino-rotate 插件,实现高效的日志轮转。
npm install pino pino-rotate
const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty', // 可选:美化输出(开发环境使用)
options: { colorize: true }
}
});
// 启动轮转(每天轮转,保留14天,压缩旧日志)
rotate({
period: '1d', // 轮转周期(1d=每天)
path: '/path/to/your/logs/pino-', // 日志路径前缀
maxsize: '20m', // 单个文件最大大小
compress: true // 压缩旧日志
})(logger);
// 测试日志
logger.info('This is a high-performance rotated log message.');
pino-rotate 支持按时间和大小轮转,兼顾性能与管理需求。