发布于2026-07-01 阅读(0)
扫一扫,手机访问
在Ubuntu环境下管理Node.js应用的日志,如果任由日志文件无限增长,用不了多久就会把磁盘空间吃掉,排查问题也会变得非常痛苦。那么,怎么实现自动化的日志轮转?其实主流方案就两条路:用系统自带的logrotate工具,或者用Node.js日志库内置的轮转功能。下面分别拆开来讲。

logrotate工具logrotate 是Linux系统里管理日志文件的经典工具,能自动完成轮转、压缩、删除旧日志这些脏活。如果你的应用是通过 systemd 或 supervisor 管理的,用它会非常省心。
先确认系统有没有安装 logrotate,没有的话安装一下:
sudo apt-get update
sudo apt-get install logrotate
然后为你的Node.js应用单独创建一个配置文件,通常放在 /etc/logrotate.d/ 目录下,比如叫 myapp:
sudo nano /etc/logrotate.d/myapp
写入配置,核心参数需要根据实际日志路径调整:
/path/to/your/nodejs/app/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
每项的意思分别是:每天轮转一次;保留最近7份;压缩旧日志(但推迟到下次轮转时再压);日志文件不存在时不报错;空文件不轮转;新日志文件的权限和属主。
配置写好后,可以用 -f 参数强制测试一下:
sudo logrotate -f /etc/logrotate.d/myapp
如果你的应用已经在用 winston、pino 这类日志库,它们通常会提供或搭配轮转子模块,比如 winston-daily-rotate-file。这样轮转逻辑可以完全由应用自身控制,不依赖系统定时任务。
下面是一个用 winston 配合每日轮转的典型示例:
const winston = require('winston');
const { combine, timestamp, printf } = winston.format;
const myFormat = printf(({ level, message, timestamp }) => {
return `${timestamp} ${level}: ${message}`;
});
const logger = winston.createLogger({
format: combine(timestamp(), myFormat),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
// 自动轮转日志
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
logger.add(transport);
logger.info('Hello, world!');
这里的关键参数:datePattern 决定了按小时还是按天生成文件;maxSize 控制单个日志文件的上限;maxFiles 控制保留时长(比如14天)。这种方式对开发者和运维人员都很友好,代码里配置好,部署后基本不用管。
两种方案选哪种?如果追求轻量、不想改应用代码,logrotate 是最稳的;如果已经用了 winston 这类库,加个插件就能搞定,维护更集中。根据你的应用场景挑一个即可。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8