温馨提示×

如何分割debian nodejs日志

小樊
44
2026-09-04 02:48:22
栏目: 编程语言

在 Debian 上“分割 Node.js 日志”通常有两种理解:

  1. 按时间/大小自动轮转(最常见):用 logrotate 管理日志文件
  2. 在 Node.js 应用里拆分日志:不同级别 / 模块写不同文件(用 winstonpino 等)

下面分别说明。


一、用 logrotate 分割 Node.js 日志(推荐)

1. 假设日志位置

例如:

/var/log/myapp/app.log

2. 创建 logrotate 配置

新建文件:

sudo nano /etc/logrotate.d/myapp

内容示例:

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

说明:

  • daily:每天分割
  • rotate 14:保留 14 天
  • compress:压缩旧日志
  • copytruncate:不重启 Node.js 直接截断日志(最重要

⚠️ 如果不用 copytruncate,Node.js 可能仍写旧文件

3. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp  # 测试
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行

二、Node.js 应用内部分割日志(多文件)

示例:winston 按级别拆分

const winston = require('winston');

const logger = winston.createLogger({
  transports: [
    new winston.transports.File({
      filename: '/var/log/myapp/error.log',
      level: 'error'
    }),
    new winston.transports.File({
      filename: '/var/log/myapp/combined.log'
    })
  ]
});

示例:pino 按天拆分

const pino = require('pino');
const pinoms = require('pino-multi-stream');

const streams = [
  { level: 'error', stream: fs.createWriteStream('/var/log/myapp/error.log') },
  { level: 'info', stream: fs.createWriteStream('/var/log/myapp/info.log') }
];

const logger = pino(pinoms.multistream(streams));

应用内拆分 + logrotate 是最佳实践


三、使用 PM2(如果你用 PM2)

PM2 自带日志管理:

pm2 install pm2-logrotate

配置:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30

日志位置:

~/.pm2/logs/

四、常见坑

❌ Node.js 用 fs.appendFile 但不支持日志轮转
✅ 一定要配合 logrotate + copytruncate

❌ Docker 容器内直接写文件
✅ 挂载 volume 或用 Docker log driver


如果你能告诉我:

  • 日志路径
  • 是否用 PM2 / Docker
  • 想按「大小 / 时间 / 级别」哪种分割

我可以给你精确配置

0