温馨提示×

linux nodejs日志如何轮转

小樊
38
2026-10-05 12:56:16
栏目: 编程语言

在 Linux 下对 Node.js 日志进行轮转(log rotation),常见做法有 应用层轮转 和 系统级轮转 两类。下面按实用程度给你梳理。


一、系统级轮转(最推荐,省心)

1. 使用 logrotate(最常见)

Node.js 只管写日志(如 app.log),由系统来切分。

示例

假设日志路径:

/var/log/myapp/app.log

创建配置文件:

sudo vim /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

参数说明:

  • daily:每天轮转
  • rotate 7:保留 7 份
  • compress:压缩旧日志
  • copytruncate:拷贝后清空原文件(Node 不需要重启)

✅ 适合大多数 Node 服务


2. PM2 + logrotate(PM2 用户首选)

如果你用 PM2:

pm2 install pm2-logrotate

常用配置:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

PM2 会自动轮转:

~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log

二、应用层轮转(Node 代码控制)

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({
  filename: 'logs/app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxFiles: '7d',
  zippedArchive: true
});

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

✅ 按天生成日志
✅ 自动删除旧日志
✅ 不依赖系统


2. 使用 pino + pino-roll

npm install pino pino-roll
const pino = require('pino');
const roll = require('pino-roll');

const logger = pino(
  { level: 'info' },
  roll({ file: 'logs/app.log', frequency: 'daily', size: '10m' })
);

三、Docker 场景

Docker log rotate

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

或 docker-compose:

logging:
  driver: json-file
  options:
    max-size: "10m"
    max-file: "5"

四、选择建议

场景 推荐方案
普通 Linux 服务 logrotate
PM2 pm2-logrotate
微服务 / 容器 winston / pino
Docker Docker logging

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

  • 是否用 PM2
  • 日志写到哪
  • 是否容器化

我可以给你 直接可用的配置。

0 踩