温馨提示×

linux中nodejs日志如何分割

小樊
35
2026-09-17 18:09:02
栏目: 编程语言

在 Linux 下,Node.js 日志分割通常不直接由 Node.js 自身完成,而是借助日志库 + 外部工具来实现。下面按常见方案从简单到专业给你系统讲一下。


一、最简单:按天/大小在代码里切(不推荐生产)

适合小项目或临时使用。

使用 winston + 按天分割

const winston = require('winston');
const { createLogger, transports, format } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = createLogger({
  format: format.combine(
    format.timestamp(),
    format.json()
  ),
  transports: [
    new DailyRotateFile({
      dirname: '/var/log/node',
      filename: 'app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxSize: '20m',
      maxFiles: '14d'
    })
  ]
});

✅ 优点:简单
❌ 缺点:进程重启、崩溃可能丢日志


二、推荐方案:Node 写 stdout + Linux 工具分割(生产常用)

架构

Node.js → stdout/stderr → 日志工具 → 分割文件

1️⃣ Node 只输出日志

console.log('info message');
console.error('error message');

2️⃣ 用 pm2 + pm2-logrotate(最常用)

安装

npm install pm2 -g
pm2 install pm2-logrotate

配置

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'

✅ 自动按大小 / 时间分割
✅ 支持压缩、保留天数
✅ 几乎零代码改动


3️⃣ 用 logrotate(系统级,最稳定)

Node 启动

node app.js >> /var/log/node/app.log 2>&1

配置 /etc/logrotate.d/node

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

✅ 系统级方案
✅ 不依赖 Node
⚠️ 必须 copytruncate(Node 不重开文件)


三、专业方案:rsyslog / systemd-journald

适合服务器集群、容器环境。

systemd 示例

[Service]
StandardOutput=journal
StandardError=journal

查看:

journalctl -u node-app

四、方案对比

方案 适合场景 稳定性 复杂度
winston 分割 小项目
pm2-logrotate 单机服务
logrotate 生产服务器
systemd/journald 容器/云

五、最佳实践建议

生产环境推荐

  • Node:只写 stdout
  • 日志分割:pm2 / logrotate
  • 日志格式:JSON(方便采集)

不要

  • 自己写文件轮转
  • fs.appendFile 长期写日志

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

  • 是否用 pm2 / docker / k8s
  • 日志量(MB/天)
  • 是否要接 ELK / Loki

我可以给你一套可直接用的配置

0