温馨提示×

如何压缩Nodejs历史日志

小樊
45
2026-07-07 10:35:16
栏目: 编程语言

压缩 Node.js 的历史日志,通常取决于日志的存储方式、大小和后续需求。下面从常见场景 → 具体做法 → 自动化建议给你一个完整方案。


一、先判断日志类型

1️⃣ 应用自己写的日志文件

例如:

logs/
 ├── app-2024-01-01.log
 ├── app-2024-01-02.log
 ├── app-2024-01-03.log

2️⃣ 使用日志库(Winston / Pino / Bunyan)

  • Winston:默认不压缩
  • Pino:可配合 pino-roll / gzip
  • PM2:自带日志系统

3️⃣ Docker / 容器日志

  • stdout 日志
  • json-file 驱动

二、最常用方式:直接压缩历史日志(推荐)

✅ 使用 gzip(最通用)

gzip logs/app-2024-01-01.log

结果:

app-2024-01-01.log.gz

✅ 优点:

  • 压缩率高
  • Node.js 可直接读取 .gz
  • Linux / macOS 原生支持

✅ 批量压缩历史日志

find logs/ -name "*.log" -mtime +7 -exec gzip {} \;

解释:

  • -mtime +7:7 天前的日志
  • 自动压缩,不压缩当天日志

三、Node.js 中处理压缩日志

1️⃣ 使用 zlib(Node 内置)

const fs = require('fs');
const zlib = require('zlib');

fs.createReadStream('logs/app.log')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('logs/app.log.gz'));

✅ 适合:

  • 自定义日志系统
  • 不想依赖外部命令

2️⃣ Pino(高性能日志,推荐)

import pino from 'pino';
import { createGzip } from 'zlib';

const logger = pino(
  {},
  createGzip({ level: 9 })
);

或者使用 pino-roll

import pino from 'pino';
import pinoRoll from 'pino-roll';

const stream = pinoRoll({
  file: 'logs/app.log',
  frequency: 'daily',
  compress: 'gzip'
});

const logger = pino({}, stream);

✅ 自动:

  • 按天切分
  • 自动 gzip

四、Winston 日志压缩方案

Winston 本身不压缩,需要配合:

✅ 方案 1:日志轮转 + 压缩

npm install winston-daily-rotate-file
import { createLogger, transports } from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';

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

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

✅ 最省心方案之一


五、Docker 场景

1️⃣ 限制日志大小(防止爆炸)

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

2️⃣ 压缩已有 Docker 日志

cd /var/lib/docker/containers
gzip *.log

⚠️ 需要停止容器或确认日志已轮转


六、自动化建议(生产环境)

✅ 使用 cron + find

0 2 * * * find /app/logs -name "*.log" -mtime +7 -exec gzip {} \;

✅ 或使用 logrotate(强烈推荐)

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

✅ 最专业、最稳定


七、压缩率 & 性能对比

方式 压缩率 性能 推荐度
gzip ⭐⭐⭐ ⭐⭐⭐ ✅✅✅
zstd ⭐⭐⭐⭐ ⭐⭐⭐⭐ ✅✅
不压缩 - ⭐⭐⭐⭐⭐

八、总结推荐方案

新项目

  • Pino + pino-roll + gzip

已有 Winston

  • winston-daily-rotate-file + zippedArchive

纯文件日志

  • find + gziplogrotate

Docker

  • json-file + max-size + 定期清理

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

  • 日志库(Winston / Pino / 原生)
  • 是否 Docker
  • 日志大小(GB 级?)

我可以给你一个完全定制的压缩方案

0