在Linux系统中配置Node.js应用的日志轮转(Log Rotation)可以有效管理日志文件,防止日志文件过大占用过多磁盘空间。以下是几种常见的配置方法:
logrotate是Linux系统自带的日志轮转工具,适用于大多数Node.js应用。
/etc/logrotate.d/
目录下)sudo nano /etc/logrotate.d/nodejs-app
/path/to/your/nodejs/app/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
dateext
dateformat -%Y%m%d
sharedscripts
postrotate
[ ! -f /var/run/nodejs-app.pid ] || kill -USR1 `cat /var/run/nodejs-app.pid`
endscript
}
daily
: 每天轮转一次missingok
: 如果日志文件不存在也不报错rotate 30
: 保留30个旧日志文件compress
: 压缩旧日志delaycompress
: 延迟压缩(压缩前一个轮转周期)notifempty
: 空日志文件不轮转copytruncate
: 复制日志文件后清空原文件(适用于不能重开日志的程序)dateext
: 使用日期作为轮转文件后缀dateformat
: 日期格式sharedscripts
: 所有日志轮转完成后再执行脚本postrotate
: 轮转后执行的命令如果你使用PM2管理Node.js进程,PM2内置了日志轮转功能:
# 安装pm2-logrotate模块
pm2 install pm2-logrotate
# 配置pm2-logrotate
pm2 set pm2-logrotate:max_size 100M # 单个日志文件最大100MB
pm2 set pm2-logrotate:retain 30 # 保留30个日志文件
pm2 set pm2-logrotate:compress true # 压缩旧日志
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
一些Node.js日志库(如winston、log4js等)支持内置的日志轮转:
const winston = require('winston');
const { combine, timestamp, printf } = winston.format;
const logger = winston.createLogger({
format: combine(
timestamp(),
printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
transports: [
new winston.transports.DailyRotateFile({
filename: 'application-%DATE%.log',
dirname: '/path/to/logs',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '100m',
maxFiles: '30d'
})
]
});
const log4js = require('log4js');
log4js.configure({
appenders: {
file: {
type: 'dateFile',
filename: '/path/to/logs/app.log',
pattern: '.yyyy-MM-dd',
keepFileExt: true,
numBackups: 30,
compress: true
}
},
categories: {
default: { appenders: ['file'], level: 'info' }
}
});
const logger = log4js.getLogger();
你也可以编写简单的shell脚本实现日志轮转:
#!/bin/bash
LOG_DIR="/path/to/logs"
DATE=$(date +%Y%m%d)
# 重命名当前日志
mv $LOG_DIR/app.log $LOG_DIR/app-$DATE.log
# 重新创建日志文件
touch $LOG_DIR/app.log
# 发送信号给Node.js应用重新打开日志文件
kill -USR1 $(cat /var/run/nodejs-app.pid)
# 压缩旧日志
find $LOG_DIR -name "app-*.log" -mtime +30 -exec gzip {} \;
# 删除过旧日志
find $LOG_DIR -name "app-*.gz" -mtime +90 -delete
通过以上方法,你可以有效地管理Node.js应用的日志文件,既保留了必要的日志信息,又避免了日志文件无限增长带来的问题。