您的位置:首页 >Linux Node.js日志轮转配置指南
发布于2026-04-20 阅读(0)
扫一扫,手机访问

日志轮转,听起来是个运维术语,但说白了,就是给你的应用日志文件“瘦身”和“归档”,防止单个日志文件无限膨胀,最终撑爆磁盘。对于Node.js应用来说,选对方案,配置得当,能省去不少后续麻烦。下面就来聊聊几种主流做法,你可以根据部署环境对号入座。
选择哪种方案,很大程度上取决于你的应用是如何部署和管理的。为了让你一目了然,这里有个快速对比表:
| 方案 | 适用场景 | 关键优点 | 注意点 |
|---|---|---|---|
| logrotate(系统级) | 任意部署方式(systemd、PM2、Docker、裸进程) | 系统自带、集中管理、稳定可靠 | 需确保应用能重新打开日志文件 |
| PM2 内置 pm2-logrotate | 使用 PM2 管理进程 | 配置简单、与 PM2 深度集成 | 仅适用于 PM2 管理的应用 |
| Node.js 日志库(winston/pino) | 需要在应用内精细控制 | 按大小/时间切分、可异步压缩 | 需处理文件句柄与进程信号 |
| Docker 日志驱动 | 容器化部署 | 与容器运行时集成、无需改代码 | 依赖容器平台能力 |
简单来说,生产环境通常优先考虑系统级的 logrotate,或者直接使用进程管理器自带的轮转功能,这样运维起来最省心。
这是最通用、最经典的方法,不挑部署方式,只要你的应用在Linux上跑,它基本都能管。
sudo apt-get install logrotatesudo yum install logrotate/var/log/yourapp/ 或 /opt/yourapp/logs/。别忘了,运行应用的用户必须对这个目录有写入权限。/etc/logrotate.d/ 目录下为你的应用新建一个配置文件,例如 /etc/logrotate.d/yourapp。/var/log/yourapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 yourapp yourapp
postrotate
# 可选:通知应用重新打开日志(如支持 SIGUSR1/SIGUSR2 或自定义 reload 脚本)
# kill -USR1 $(cat /var/run/yourapp.pid) 2>/dev/null || true
endscript
}
daily:按天轮转。可以换成 hourly、weekly 或 monthly。rotate N:保留N个历史日志副本。compress / delaycompress:压缩旧日志。delaycompress 会延迟一次再压缩,避免影响对最新日志的读取。missingok / notifempty:日志文件缺失或者为空时,不报错、不进行轮转。create MODE OWNER GROUP:轮转后新建日志文件的权限、属主和属组。postrotate … endscript:轮转后执行的钩子脚本。这里是关键——通常用来通知你的Node.js应用重新打开日志文件句柄。sudo logrotate -d /etc/logrotate.d/yourappsudo logrotate -f /etc/logrotate.d/yourappapp.log.1.gz、app.log.2.gz 这样的归档文件,并且新的日志能正常写入到新的 app.log 中。copytruncate:先复制当前日志内容,然后清空原文件。这种方式不需要应用配合,适合那些无法接收信号重开日志的应用。
/var/log/yourapp/*.log {
daily
rotate 7
compress
copytruncate
missingok
notifempty
}
postrotate 发送信号:在钩子脚本里向应用进程发送特定信号(如SIGUSR1),要求它重新打开日志文件。这需要你的Node.js应用代码能够捕获并处理这个信号。如果你的应用全程由PM2管理,那么用它的官方插件就是最丝滑的选择。
pm2 install pm2-logrotatepm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval “0 0 * * *”
pm2 restart all 让配置生效。轮转后的日志默认存放在 ~/.pm2/logs/ 目录下。有时候,你需要更精细的控制,比如按日志文件大小和日期双重规则切割,或者想直接输出结构化的JSON日志并异步压缩。这时,在应用代码层面实现轮转就更灵活。
const winston = require(‘winston’);
const DailyRotateFile = require(‘winston-daily-rotate-file’);
const transport = new DailyRotateFile({
filename: ‘application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
});
const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [transport]
});
logger.info(‘Hello, world!’);
const pino = require(‘pino’);
const rotate = require(‘pino-rotate’);
const logger = pino({level: ‘info’});
rotate({
period: ‘1d’,
path: ‘application.log’,
size: ‘20m’,
compress: true,
rotate: true
});
logger.info(‘Hello, world!’);
当应用跑在容器里,或者规模上去之后,日志管理又得有新思路。
local 日志驱动,直接限制单个容器日志的大小和数量,这是防止容器日志“爆仓”的最基础防线。
docker run -d \
--name my_app \
--log-driver local \
--log-opt max-size=10m \
--log-opt max-file=3 \
my_image
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9