温馨提示×

nodejs linux日志怎么压缩

小樊
45
2026-10-05 12:55:13
栏目: 编程语言

在 Linux 上,Node.js 日志压缩通常不是 Node.js 自己做的,而是配合日志库 + Linux 工具/定时任务来完成。常见方案如下:


一、Node.js 日志按大小/时间滚动(推荐)

使用日志库自动切分日志,再用 Linux 压缩。

1️⃣ 使用 winston + winston-daily-rotate-file

const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  filename: 'logs/app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',
  maxFiles: '14d',
  zippedArchive: true // ✅ 自动压缩
});

const logger = winston.createLogger({
  transports: [transport]
});

✅ 优点:

  • 自动按天/大小切分
  • 自动 gzip 压缩
  • 不需要额外脚本

2️⃣ 使用 pino + pino-roll

const pino = require('pino');
const rotate = require('pino-roll');

const logger = pino(
  {},
  rotate({ file: 'logs/app.log', size: '20m', compress: 'gzip' })
);

✅ 性能好,适合高并发服务


二、已有日志文件,用 Linux 手动/自动压缩

1️⃣ 手动压缩

gzip app.log
# 或
tar -czf logs.tar.gz logs/

2️⃣ 定时压缩(crontab)

每天凌晨压缩前一天日志:

0 0 * * * gzip /var/log/node/app-$(date -d yesterday +%F).log

三、使用 logrotate(最推荐 ⭐)

Linux 自带日志管理工具,适合生产环境。

示例 /etc/logrotate.d/node-app

/var/log/node/*.log {
  daily
  rotate 14
  compress
  delaycompress
  missingok
  notifempty
  copytruncate
}

参数说明:

  • compress:gzip 压缩
  • copytruncate:不重启 Node 也能截断日志
  • daily:每天执行

测试:

logrotate -d /etc/logrotate.d/node-app

四、方案对比

方案 是否推荐 说明
Node.js 内压缩 ❌ 影响性能
winston/pino ✅ 自动切分+压缩
logrotate ✅✅ 生产最稳定
手动 gzip ⚠️ 临时用

五、生产最佳实践 ✅

  • Node:只负责写日志(stdout / 文件)
  • Linux:logrotate 负责压缩、清理
  • Docker:挂载 volume + logrotate

如果你愿意,可以告诉我:

  • 用的是 express / koa / nestjs
  • 日志写到 文件还是 stdout
  • 是否 Docker 部署

我可以给你一套完整配置。

0 踩