温馨提示×

Debian Nodejs日志为何过大

小樊
36
2026-07-13 03:49:10
栏目: 编程语言

Debian 上 Node.js 日志过大通常不是 Node.js 本身的问题,而是日志策略、应用写法或系统配置导致的。下面按常见原因 → 排查方法 → 解决方案来说明。


一、常见原因

1️⃣ 应用未做日志轮转(最常见)

Node.js 应用(如 PM2、Docker、systemd)持续往同一个日志文件写,没有:

  • 日志切割
  • 日志压缩
  • 日志清理

✅ 结果:
app.log / pm2 logs / combined.log 越来越大


2️⃣ 日志级别设置过低

例如:

  • 生产环境仍使用 debug / silly
  • 每个请求都打日志
logger.debug('request body:', req.body)
logger.debug('query:', req.query)

✅ 结果:
高并发下日志量爆炸


3️⃣ 异常未捕获,导致重复打印

try {
  ...
} catch (e) {
  console.error(e);
  console.error(e.stack);
}

或:

  • Promise 未 catch
  • 同一错误被多次 log

4️⃣ PM2 默认日志不限制

PM2 默认:

  • pm2 logs 一直追加
  • 不自动清理

路径通常是:

~/.pm2/logs/

5️⃣ systemd 日志未限制

如果 Node.js 是通过 systemd 启动:

StandardOutput=journal
StandardError=journal

journald 默认可能 不限制大小


6️⃣ 日志被重定向到文件但未 rotate

例如:

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

没有 logrotate


二、快速排查方法

1️⃣ 查看哪个日志最大

du -sh /var/log/*
du -sh ~/.pm2/logs/*
journalctl --disk-usage

2️⃣ 查看 Node.js 日志配置

检查是否使用:

  • winston
  • pino
  • morgan
  • console.log

重点看:

  • 日志级别
  • 是否写文件
  • 是否启用 rotate

3️⃣ 查看 PM2 日志

pm2 logs
pm2 flush   # 清空日志(临时)

4️⃣ 查看 systemd 日志

journalctl -u your-node-service --no-pager | head

三、解决方案(推荐)

✅ 方案一:使用日志轮转(强烈推荐)

PM2

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

systemd

编辑 service:

[Service]
StandardOutput=append:/var/log/node/app.log
StandardError=append:/var/log/node/error.log

配合 logrotate

/var/log/node/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
}

✅ 方案二:调整日志级别

生产环境:

logger.level = 'info';

避免:

console.log(JSON.stringify(req))

✅ 方案三:使用专业日志库

推荐:

  • Winston + winston-daily-rotate-file
  • Pino(性能最好)

示例(Winston):

new winston.transports.DailyRotateFile({
  filename: 'app-%DATE%.log',
  maxSize: '20m',
  maxFiles: '14d'
})

✅ 方案四:限制 journald 大小

journalctl --vacuum-size=200M

或编辑:

/etc/systemd/journald.conf
SystemMaxUse=200M

四、总结一句话

Debian 上 Node.js 日志过大的根本原因通常是:日志没有轮转 + 日志级别不合理。

如果你愿意,可以把下面信息发我,我可以给你精确方案

  • ✅ Node.js 启动方式(PM2 / systemd / Docker)
  • ✅ 使用的日志库
  • ✅ 日志路径
  • ✅ 当前日志大小

我可以直接帮你写 logrotate / PM2 / systemd 配置

0