Linux环境下Node.js日志清理策略
logrotate是Linux系统自带的日志管理工具,支持自动轮转、压缩、删除旧日志,无需修改应用代码,适合大多数场景。
sudo apt-get install logrotate;CentOS/RHEL系统运行sudo yum install logrotate。/etc/logrotate.d/目录下创建Node.js专用配置文件(如nodejs),内容示例如下:/path/to/your/nodejs/logs/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
missingok # 日志文件不存在时不报错
rotate 7 # 保留最近7个轮转日志
compress # 压缩旧日志(节省空间)
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件权限及属主(根据实际调整)
}
sudo logrotate -f /etc/logrotate.d/nodejs。若应用使用winston、pino等日志库,可通过内置模块实现日志轮转,适合需要定制化日志格式或路径的场景。
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/logs/application-%DATE%.log', // 日志文件名模板(%DATE%会被替换为日期)
datePattern: 'YYYY-MM-DD', // 日期格式(每天一个文件)
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个日志文件最大20MB
maxFiles: '14d' // 保留14天内的日志
});
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]
});
module.exports = logger;
npm install pino pino-rotate。const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
level: 'info'
});
rotate({
period: '1d', // 每天轮转一次
path: '/path/to/logs', // 日志目录
maxFiles: 7, // 保留7个日志文件
gzip: true // 压缩旧日志
})(logger);
logger.info('Application started');
若不想依赖第三方工具,可通过cron定时执行shell脚本清理旧日志,适合简单场景。
/usr/local/bin/clean-nodejs-logs.sh,内容如下:#!/bin/bash
LOG_DIR="/path/to/your/nodejs/logs"
find "$LOG_DIR" -type f -name "*.log" -mtime +7 -exec rm -f {} \; # 删除7天前的.log文件
sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh。crontab -e,添加以下内容(每天凌晨0点执行):0 0 * * * /usr/local/bin/clean-nodejs-logs.sh
若应用通过systemd管理(如nodejs.service),可创建systemd定时器与服务来清理日志,适合容器化或服务化部署。
clean-nodejs-logs.sh脚本。/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
/etc/systemd/system/clean-nodejs-logs.timer,内容如下:[Unit]
Description=Run clean-nodejs-logs daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable clean-nodejs-logs.timer
sudo systemctl start clean-nodejs-logs.timer
若使用pm2管理Node.js应用,可通过pm2的内置功能实现日志轮转,无需额外配置工具。
pm2 set pm2:log_rotate true开启全局日志轮转,或通过ecosystem.config.js文件自定义:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/path/to/logs/out.log',
error_file: '/path/to/logs/err.log',
log_date_format: 'YYYY-MM-DD HH:mm Z',
max_size: '10M', // 单个日志文件最大10MB
retain: 7 // 保留7个日志文件
}]
};
pm2 reload ecosystem.config.js使设置生效。