温馨提示×

Linux Nodejs日志如何归档

小樊
41
2026-08-29 01:17:23
栏目: 编程语言

在 Linux 环境下对 Node.js 日志进行归档,常见的目标是:
✅ 控制日志文件大小
✅ 防止磁盘被写满
✅ 方便排查历史问题
✅ 自动清理过期日志

下面按 推荐程度 给你几种成熟方案,并附示例。


✅ 方案一(最推荐):使用日志库自带的归档功能

1️⃣ Winston + winston-daily-rotate-file(最常用)

安装

npm install winston winston-daily-rotate-file

示例配置

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

const transport = new DailyRotateFile({
  dirname: '/var/log/myapp',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',        // 单个文件最大 20MB
  maxFiles: '14d',       // 保留 14 天
  zippedArchive: true    // 归档时压缩
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    transport,
    new winston.transports.Console()
  ]
});

logger.info('hello world');

✅ 优点

  • 自动按天 / 大小切分
  • 自动压缩、自动删除
  • 生产环境首选

✅ 方案二:PM2 + 日志管理(如果你用 PM2)

PM2 自带日志

pm2 logs

日志路径

~/.pm2/logs/

限制日志大小(PM2 配置)

ecosystem.config.js

module.exports = {
  apps: [{
    name: 'app',
    script: 'app.js',
    max_memory_restart: '500M',
    error_file: '/var/log/app/err.log',
    out_file: '/var/log/app/out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss'
  }]
};

⚠️ PM2 不会自动归档,需要配合 logrotate


✅ 方案三:Linux logrotate(系统级归档,强烈推荐)

适合 所有 Node.js 日志(无论用什么日志库)

1️⃣ 创建 logrotate 配置文件

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

2️⃣ 配置示例

/var/log/myapp/*.log {
    daily
    rotate 14
    size 100M
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
}

参数说明

参数 含义
daily 每天轮转
rotate 14 保留 14 份
size 100M 超过 100M 即轮转
compress gzip 压缩
copytruncate 不重启应用

✅ 优点

  • 与 Node.js 解耦
  • 非常稳定
  • 运维标准做法

✅ 方案四:Pino + pino-roll(Pino 用户)

安装

npm install pino pino-roll

示例

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

const logger = pino(
  pinoRoll({
    file: '/var/log/myapp/app.log',
    frequency: 'daily',
    size: '10m',
    limit: 7
  })
);

logger.info('pino rolling log');

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


✅ 方案五:Docker 环境

推荐方式

  • 不要在容器里写文件
  • 日志输出到 stdout
  • 使用 Docker log driver
docker run \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  app

✅ 最佳实践
✅ 不污染容器文件系统


✅ 推荐组合(生产环境)

场景 推荐方案
普通 Node.js 服务 Winston + logrotate
PM2 PM2 + logrotate
高性能 Pino + pino-roll
Docker stdout + Docker log driver

❌ 不推荐的做法

  • 自己写 setInterval 切日志
  • 日志无限写入不限制
  • 只写文件不归档

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

  • ✅ 是否使用 PM2 / Docker
  • ✅ 日志路径
  • ✅ 日志库(Winston / Pino / 自写)

我可以直接帮你写 完整配置

0