温馨提示×

Nodejs日志在Debian为何丢失

小樊
38
2026-07-13 03:47:09
栏目: 编程语言

Debian 上运行 Node.js 时日志“丢失”,通常不是真的消失了,而是输出方式、systemd、管道、日志轮转或权限等问题导致的。下面按最常见原因 → 排查方法 → 解决办法来说明。


一、最常见原因(90% 都在这里)

1️⃣ 使用了 console.log,但被 systemd / 容器吞掉

如果你用 systemd 管理 Node.js 服务:

[Service]
ExecStart=/usr/bin/node /app/server.js

console.log 不会写文件
✅ 默认输出到 journald
❌ 如果你没配置,很容易“看起来没日志”

排查

journalctl -u your-service-name -f

解决

✅ 显式输出到 stdout / stderr(推荐):

console.log('info')
console.error('error')

✅ 或写文件:

const fs = require('fs')
fs.appendFileSync('/var/log/node/app.log', msg + '\n')

2️⃣ 日志被 systemd 截断 / 缓冲

Node.js 输出是 行缓冲,但 systemd 有时会延迟显示。

解决

[Service]
StandardOutput=journal
StandardError=journal

或:

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

3️⃣ 日志文件存在,但权限不对(Debian 常见)

Debian 默认:

  • 服务以 nobody / www-data 运行
  • /var/log 只有 root 可写

现象

  • 程序无报错
  • 日志文件不增长

解决

sudo mkdir -p /var/log/node
sudo chown -R www-data:www-data /var/log/node

4️⃣ 日志被 logrotate 截断

Debian 常见 /etc/logrotate.d/

如果配置错误:

  • 文件被清空
  • inode 变了
  • Node 仍写旧 fd

错误示例

/var/log/node/*.log {
    daily
    truncate
}

正确做法

copytruncate

或让 Node 重新打开文件(推荐用 PM2 / winston)


5️⃣ 用 PM2 但没看 PM2 日志

如果你用 PM2

pm2 logs
pm2 logs app-name

PM2 默认日志在:

~/.pm2/logs/

✅ 很容易误以为“日志丢了”


6️⃣ Docker / 容器环境

在 Docker + Debian 中:

  • console.log 必须输出到 stdout
  • 不要在容器里写文件

✅ 正确:

console.log('hello')

❌ 错误:

fs.writeFileSync('/app/log.txt', '...')

二、Node.js 本身的问题

1️⃣ 异常没 catch,进程直接退出

process.on('uncaughtException', err => {
  console.error(err)
})

2️⃣ 日志被 winston / pino 配置错误

常见错误:

  • transport 没加
  • level 设成 error,info 不显示

三、快速自检清单 ✅

请逐条确认:

  • [ ] 是否用 console.log
  • [ ] 是否用 systemd?
  • [ ] 是否查看 journalctl
  • [ ] 文件权限是否正确?
  • [ ] 是否被 logrotate 截断?
  • [ ] 是否用 PM2 但看错地方?
  • [ ] 是否 Docker 环境?

四、推荐的生产级做法(Debian)

标准组合

  • systemd
  • stdout / stderr
  • journald
  • 或 winston + 文件

示例 systemd

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

五、如果你愿意,我可以帮你精准定位

你可以直接贴出:

  1. 启动方式(systemd / PM2 / Docker / 手动)
  2. 日志代码示例
  3. Debian 版本
  4. 是否写文件 / 用 console

我可以 直接告诉你哪一行导致日志丢失

0