Ubuntu下Node日志清理方法
一 常用方案总览
- 使用系统自带的logrotate做按天/按大小轮转并自动清理旧文件,适合绝大多数场景。
- 使用cron或systemd timer定期执行清理脚本,灵活控制保留天数与路径。
- 在应用内使用日志库的按日/按大小轮转能力(如winston-daily-rotate-file、pino-rotate),与应用生命周期绑定。
- 若你的Node应用由systemd托管,也可将stdout/stderr接入journald,再用journald的保留策略清理系统日志。
二 使用logrotate进行自动轮转与清理
- 安装与放置配置(通常已预装logrotate):
- sudo apt-get update && sudo apt-get install -y logrotate
- 新建配置:sudo nano /etc/logrotate.d/nodejs-app
- 示例配置(按天轮转、保留7天、压缩、自动重建日志文件):
- /path/to/your/nodejs/app/logs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
- 关键参数说明:
- daily/weekly/monthly:轮转周期;可叠加size 100M按大小触发。
- rotate N:保留最近N个归档。
- compress:gzip压缩旧日志。
- missingok/notifempty:文件缺失或为空时不报错/不轮转。
- create 0640 root adm:轮转后新建文件的权限与属主属组。
- 如需“轮转后通知应用重新打开日志”,可在postrotate中执行:killall -USR1 node 或 systemctl reload your-app。
- 测试与生效:
- 手动触发:sudo logrotate -f /etc/logrotate.d/nodejs-app
- 查看状态:cat /var/lib/logrotate/status
- 默认由**/etc/cron.daily/logrotate**每日执行,无需额外cron。
三 使用cron或systemd timer定期清理
- 简单Bash脚本清理超过N天的.log文件:
- sudo nano /usr/local/bin/clean-nodejs-logs.sh
- 内容:
- #!/bin/bash
LOG_DIR=“/path/to/your/nodejs/app/logs”
DAYS_TO_KEEP=7
find “$LOG_DIR” -type f -name “*.log” -mtime +“$DAYS_TO_KEEP” -delete
- 赋权:sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh
- 方式A(cron):
- crontab -e 加入:0 1 * * * /usr/local/bin/clean-nodejs-logs.sh
- 方式B(systemd timer,更现代):
- /etc/systemd/system/clean-nodejs-logs.timer
- [Unit]
Description=Clean 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 older than 7 days
[Service]
ExecStart=/usr/local/bin/clean-nodejs-logs.sh
- 启用:
- sudo systemctl daemon-reload
- sudo systemctl enable --now clean-nodejs-logs.timer
- 查看状态:systemctl list-timers
四 在Node.js应用内做日志轮转
- 使用winston + winston-daily-rotate-file:
- 安装:npm i winston winston-daily-rotate-file
- 示例:
- const winston = require(‘winston’);
const DailyRotateFile = require(‘winston-daily-rotate-file’);
const logger = winston.createLogger({
level: ‘info’,
transports: [
new DailyRotateFile({
filename: ‘/path/to/your/nodejs/app/logs/app-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
})
]
});
- 使用pino + pino-rotate(按日轮转示例):
- 安装:npm i pino pino-rotate
- 示例:
- const pino = require(‘pino’);
const rotate = require(‘pino-rotate’);
rotate({
period: ‘1d’,
path: ‘/path/to/your/nodejs/app/logs’,
maxFiles: 7,
gzip: true
});
const logger = pino({ level: ‘info’ }, rotate());
- 适用场景:容器化/多实例部署、希望与应用生命周期一致、无需外部依赖。
五 易混淆日志与注意事项
- 区分日志来源:
- 应用日志:位于你的应用目录(如**/var/log/yourapp/或项目内logs/**),用上文方法清理。
- 系统日志:由journald管理(如服务stdout/stderr被接入journal)。清理命令示例:
- 按大小:sudo journalctl --vacuum-size=1G
- 按时间:sudo journalctl --vacuum-time=3d
- 安全与权限:
- 清理脚本与logrotate配置中的create权限应与应用运行用户匹配,避免日志写入失败。
- 删除前建议先备份或先移动到临时目录观察一段时间。
- 避免误删:
- 使用find时精确匹配(如-name “*.log”),避免匹配到压缩包或其他重要文件。
- 验证与观测:
- 观察轮转是否生效:ls -lh /path/to/logs;查看logrotate状态:cat /var/lib/logrotate/status。
- 若接入journald,用journalctl -u your-app查看服务日志是否正常输出。