Ubuntu Node.js日志清理策略
logrotate是Ubuntu系统自带的日志管理工具,专为日志轮转、压缩、删除设计,适合集中管理Node.js应用日志。
sudo apt-get update && sudo apt-get install logrotate
/etc/logrotate.d/目录下新建nodejs-app文件(如/etc/logrotate.d/nodejs-app),添加以下内容(根据实际路径调整):/path/to/your/nodejs/app/logs/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(如第8个文件才压缩,避免压缩当天日志)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件权限(属主root,属组adm)
sharedscripts # 所有日志轮转完成后执行后续命令
postrotate # 可选:重启Node.js应用(若日志写入依赖进程)
systemctl restart your-nodejs-service || true
endscript
}
sudo logrotate -f /etc/logrotate.d/nodejs-app
/etc/cron.daily/logrotate每日自动运行,可通过以下命令查看执行日志:tail -f /var/log/syslog | grep logrotate
通过Node.js日志库(如winston)内置的轮转功能,实现应用层日志管理,适合需要精细化控制的场景。
npm install winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new DailyRotateFile({
filename: '/path/to/your/nodejs/app/logs/application-%DATE%.log', // 日志文件名(含日期)
datePattern: 'YYYY-MM-DD', // 日期格式(每天一个文件)
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个日志文件最大20MB(触发轮转)
maxFiles: '14d', // 保留14天的日志
createSymlink: true, // 创建符号链接(指向最新日志)
symlinkName: 'current.log' // 符号链接名称
})
]
});
// 使用logger记录日志
logger.info('Application started');
参数说明:
maxSize:单个日志文件大小阈值(超过则轮转);maxFiles:保留的日志文件天数(或数量,如100表示保留100个文件);zippedArchive:是否压缩旧日志(减少存储占用)。若需立即释放空间,可通过命令行手动删除旧日志文件(谨慎使用,避免误删)。
rm /path/to/your/nodejs/app/logs/*.log
find命令):find /path/to/your/nodejs/app/logs -type f -name "*.log" -mtime +7 -exec rm -f {} \;
参数说明:
-type f:仅查找文件(排除目录);-mtime +7:修改时间超过7天的文件;-exec rm -f {} \;:对找到的文件执行删除操作。若Node.js应用通过systemd管理,可创建定时任务定期执行清理脚本(适合需要与系统服务集成的场景)。
/usr/local/bin/clean-nodejs-logs.sh):#!/bin/bash
LOG_DIR="/path/to/your/nodejs/app/logs"
find "$LOG_DIR" -type f -name "*.log" -mtime 7 -exec rm -f {} \;
sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh
/etc/systemd/system/clean-nodejs-logs.timer):[Unit]
Description=Daily cleanup of Node.js logs older than 7 days
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
/etc/systemd/system/clean-nodejs-logs.service):[Unit]
Description=Clean Node.js logs
[Service]
ExecStart=/usr/local/bin/clean-nodejs-logs.sh
sudo systemctl daemon-reload
sudo systemctl enable --now clean-nodejs-logs.timer