温馨提示×

nodejs日志在debian如何分割

小樊
38
2026-09-10 04:49:10
栏目: 编程语言

在 Debian 上,Node.js 自身不会自动分割日志,通常需要借助外部工具来实现日志轮转(log rotation)。下面按常见方案从简单到专业给你介绍几种做法。


一、最推荐:使用系统自带 logrotate(标准做法)

Debian 自带 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 也能切割(关键)
  • notifempty:空文件不切

3. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp   # 模拟
sudo logrotate -f /etc/logrotate.d/myapp   # 强制执行

适合:

  • 使用 fs.writeFile / console.log / winston 直接写文件
  • 不想改代码

二、Node.js 代码层切割(不依赖系统)

方案 A: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',
  maxFiles: '14d',
  zippedArchive: true
});

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

logger.info('hello');

✅ 优点:

  • 跨平台
  • 自动按天/大小切割
  • 不依赖 Linux

三、PM2 用户(非常常见)

如果你用 PM2 启动 Node.js,它自带日志管理。

1. PM2 日志默认位置

~/.pm2/logs/

2. 使用 PM2 自带分割

pm2 install pm2-logrotate

配置示例:

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

✅ 优点:

  • 零配置
  • 适合生产环境

四、按文件大小切割(高级)

logrotate 也支持:

size 50M

示例:

/var/log/myapp/app.log {
    size 50M
    rotate 10
    compress
    copytruncate
}

五、方案选择建议

场景 推荐方案
直接写文件 logrotate
用 winston/pino daily-rotate-file
用 PM2 pm2-logrotate
容器/Docker 挂载 + logrotate 或 sidecar

六、常见坑

❌ Node.js 写日志后 文件被 rename 但 fd 不变 ✅ 一定要用 copytruncate

❌ Docker 容器里直接 logrotate ✅ 在宿主机做,或用 docker logs


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

  • 你是怎么启动 Node.js 的(pm2 / systemd / docker)
  • 日志是怎么写的(console / fs / winston)

我可以给你完全匹配你环境的配置

0