温馨提示×

Debian如何分割Nodejs日志

小樊
41
2026-07-13 04:01:10
栏目: 编程语言

在 Debian 上“分割 Node.js 日志”通常指 防止日志文件无限增长,常见做法有三类:日志库自带轮转、系统 logrotate、PM2 自带轮转。下面按常见场景给你一套实用方案。


一、最常见方案:使用 logrotate(推荐 ✅)

适合:

  • Node.js 直接运行(systemd / 手动启动)
  • 日志输出到文件(如 logs/app.log

1️⃣ 安装 logrotate(一般已自带)

dpkg -l | grep logrotate

如果没有:

sudo apt update
sudo apt install logrotate

2️⃣ 创建 Node.js 日志轮转配置

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

示例配置:

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

参数说明

参数 作用
daily 每天轮转
rotate 7 保留 7 份
compress 压缩旧日志
copytruncate 不重启 Node.js 也能生效
create 新建日志文件权限

3️⃣ 测试是否生效

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

二、Node.js 代码层日志分割(Winston 示例)

如果你用 Winston(最常用):

安装

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({
  level: 'info',
  transports: [
    transport,
    new winston.transports.Console()
  ]
});

logger.info('Hello Node.js log');

✅ 自动生成:

logs/app-2026-01-21.log
logs/app-2026-01-20.log

三、使用 PM2 管理 Node.js(最简单 ✅)

1️⃣ 安装 PM2

npm install -g pm2

2️⃣ 启动应用

pm2 start app.js --name my-app

3️⃣ 开启日志轮转

pm2 install pm2-logrotate

4️⃣ 配置

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

✅ PM2 会自动处理:

~/.pm2/logs/my-app-out.log
~/.pm2/logs/my-app-out__2026-01-21.log

四、systemd + logrotate(生产环境推荐)

如果你用 systemd 启动 Node.js:

service 示例

[Service]
ExecStart=/usr/bin/node /opt/app/app.js
StandardOutput=append:/var/log/node/app.log
StandardError=append:/var/log/node/error.log

然后配合 logrotate 即可。


五、方案选择建议

场景 推荐
普通 Debian 服务器 logrotate
使用 PM2 pm2-logrotate
需要按天/大小精确控制 Winston DailyRotate
生产 Docker / systemd logrotate + systemd

六、常见坑 ⚠️

不要直接 mv 日志文件
Node.js 仍占用旧 inode,日志不会写入新文件

✅ 正确方式:

  • copytruncate
  • 或重启进程
  • 或使用日志库轮转

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

  • 是否使用 PM2 / systemd / Docker
  • 日志是 stdout 还是文件
  • 日增量大概多大

我可以帮你定制一套最合适的日志分割方案。

0