温馨提示×

Debian Nodejs日志如何分割

小樊
35
2026-07-27 13:56:05
栏目: 编程语言

在 Debian 上,Node.js 本身不自带日志分割功能,日志分割通常由外部工具日志库来完成。下面按常见场景给你几种成熟、可落地的做法,从简单到生产级。


一、最推荐:用 pm2 自带日志分割 ✅(最常用)

如果你用 pm2 管理 Node.js 进程,这是最简单、最稳定的方案。

1️⃣ 安装 pm2

npm install -g pm2

2️⃣ 安装 pm2-logrotate

pm2 install pm2-logrotate

3️⃣ 配置日志分割

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

含义:

  • max_size:单个日志超过 10MB 就分割
  • retain:保留最近 7 个日志
  • compress:启用 gzip 压缩

4️⃣ 日志位置

~/.pm2/logs/

优点

  • 零代码改动
  • 自动按大小/时间切割
  • 生产环境首选

二、用 Linux 自带 logrotate(系统级方案) ✅

适合不用 pm2、直接 systemd / 原生启动 Node.js 的情况。

1️⃣ 示例 Node.js 日志

/var/log/node/app.log

2️⃣ 创建 logrotate 配置

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

内容示例:

/var/log/node/app.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

3️⃣ 参数说明

参数 说明
daily 每天切割
rotate 7 保留 7 份
compress gzip 压缩
copytruncate 不重启进程直接切割

优点

  • Debian 原生支持
  • 适合系统服务
  • 稳定可靠

三、Node.js 代码内日志分割(不推荐单独用)

使用 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: 'logs',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',
  maxFiles: '14d'
});

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

logger.info('hello world');

适合

  • 容器环境
  • 不想依赖系统工具

⚠️ 缺点

  • 功能不如 pm2 / logrotate 完善
  • 多进程需注意

四、Docker 场景(补充)

如果你在 Docker 中运行 Node.js:

不要自己分割日志

docker logs

配合:

  • json-file
  • logrotate
  • 或日志收集系统(ELK / Loki)

五、如何选择?✅ 总结建议

场景 推荐方案
pm2 管理 Node.js ✅ pm2-logrotate
systemd / 原生启动 ✅ logrotate
容器 ✅ stdout + 日志系统
小项目 ✅ winston 分割

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

  • ✅ 是否使用 pm2
  • ✅ 是否 systemd
  • ✅ 是否 Docker
  • ✅ 日志路径

我可以帮你直接写一份可用的完整配置

0