温馨提示×

Debian Nodejs日志为何不写

小樊
38
2026-10-13 00:23:44
栏目: 编程语言

在 Debian 上部署 Node.js 应用时,“日志不写”通常不是 Node 本身的问题,而是运行方式、权限、路径或日志库配置导致的。下面按最常见原因逐一排查。


一、最常见原因速查

1. Node 进程不是在“你以为的目录”运行

日志路径写的是相对路径,例如:

fs.writeFileSync('./logs/app.log', 'xxx')

但用 systemd 或 pm2 启动时,工作目录可能不是项目目录。

✅ 解决:

  • 用绝对路径
const path = require('path');
const logFile = path.join(__dirname, 'logs', 'app.log');
  • 或确认启动目录

2. systemd 服务没配置工作目录

如果你用 systemd:

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

默认工作目录是 /

✅ 解决:

WorkingDirectory=/opt/app

然后:

systemctl daemon-reload
systemctl restart yourapp

3. 没有写权限(非常常见)

日志目录不存在 or 权限不足:

ls -ld logs
whoami

✅ 解决:

mkdir -p /opt/app/logs
chown -R youruser:youruser /opt/app/logs

4. 日志被 systemd 吞了(没写文件,只写 stdout)

很多 Node 程序只 console.log(),没写文件。

在 Debian + systemd 下:

journalctl -u yourapp.service

✅ 如果你只想看“日志不写文件”,这是正常的


5. PM2 日志位置你找错了

PM2 默认日志不在你项目里:

~/.pm2/logs/

查看:

pm2 logs
pm2 show yourapp

6. 日志库被“缓冲”了(没 flush)

例如 winston / pino:

  • 程序崩溃前没 flush
  • 用了异步写入

✅ 解决:

  • 捕获退出
process.on('exit', () => logger.end());
  • 或用同步 logger(开发期)

7. 磁盘满了 / inode 用完

df -h
df -i

8. Docker / 容器环境(如果你在 Debian 上跑容器)

日志写进容器,但容器被销毁。

✅ 解决:

  • 挂载 volume
  • 或输出到 stdout

二、快速自检清单

# 1. 进程是否还在
ps aux | grep node

# 2. systemd 日志
journalctl -u yourapp -f

# 3. 文件是否生成
find / -name "*.log" 2>/dev/null

# 4. 权限
namei -l /opt/app/logs/app.log

三、推荐做法(Debian 生产环境)

✅ 不要自己写文件日志
✅ 用 systemd + journald

console.log('[info] xxx');
journalctl -u yourapp.service -f

如果你愿意,可以贴:

  • 启动方式(systemd / pm2 / 直接 node)
  • 日志代码片段
  • Debian 版本

我可以精确告诉你“为什么没写”。

0 踩