温馨提示×

Nodejs日志为何在Linux为空

小樊
46
2026-08-29 00:53:23
栏目: 编程语言

Node.js 在 Linux 下日志为空,通常不是 Node 本身的问题,而是运行环境、启动方式或输出去向的问题。下面按最常见 → 较少见逐一排查。


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

1️⃣ 使用 pm2 / nohup / systemd 启动,没有重定向 stdout

Node.js 的 console.log() 输出到 stdout,而 Linux 后台运行时会把 stdout 丢弃或不显示。

示例问题

nohup node app.js &
# 或
pm2 start app.js

你可能看不到任何日志,因为:

  • nohup 默认写 nohup.out
  • pm2 日志在 ~/.pm2/logs/
  • systemd 日志在 journalctl

✅ 正确做法
pm2:

pm2 logs

nohup:

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

systemd:

[Service]
StandardOutput=journal
StandardError=journal

2️⃣ 日志被 systemd 接管,但没看 journal

如果你用 systemd 启动 Node:

sudo journalctl -u your-service-name -f

而不是去 /var/log/ 找文件。


3️⃣ 使用了日志库,但没配置 transport(winston / pino 常见)

例如 winston 没加 console transport

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json()
  // ❌ 没有 transports
});

✅ 正确:

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

二、环境变量 / 平台差异

4️⃣ NODE_ENV=production 关闭了日志

某些框架(如 NestJS、Egg.js)在 production 环境会:

  • 关闭 debug 日志
  • 提高日志级别

检查:

echo $NODE_ENV

临时测试:

NODE_ENV=development node app.js

5️⃣ Linux 下 stdout 被缓冲(不是每次 flush)

Node.js 在非 TTY 下 stdout 是块缓冲

✅ 测试:

setInterval(() => {
  console.log('still alive');
}, 1000);

✅ 强制刷新:

process.stdout.write('log\n');

或:

export NODE_DEBUG=*

三、文件路径问题(最常见误解)

6️⃣ 以为日志写了文件,结果路径不对

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

在 Linux 下:

  • ./启动目录,不是源码目录
  • pm2 启动时可能是 /

✅ 正确写法:

const path = require('path');
const fs = require('fs');

const logPath = path.join(__dirname, 'logs/app.log');
fs.writeFileSync(logPath, data);

四、Docker 场景(非常常见)

7️⃣ Docker 容器里日志为空

Docker 只捕获 stdout/stderr

❌ 错误:

fs.writeFileSync('/app/app.log', data);

✅ 正确:

console.log(data);

或:

docker logs <container_id>

五、快速定位 checklist ✅

请逐条确认:

  • [ ] 是 console.log 还是日志库?
  • [ ] 是否用 pm2 / systemd / nohup / docker
  • [ ] 是否查看了对应日志位置?
  • [ ] 是否 NODE_ENV=production
  • [ ] 日志路径是否用了 __dirname
  • [ ] 是否 stdout 被缓冲?

六、最小测试脚本(用来验证)

setInterval(() => {
  console.log(new Date().toISOString(), 'hello linux');
}, 1000);

运行:

node test.js

✅ 如果有输出 → Node 正常
❌ 没输出 → 环境或启动方式问题


如果你愿意,可以把下面信息发我,我可以直接帮你定位到底是哪一条

  1. 启动方式(pm2 / systemd / docker / 直接 node)
  2. 日志是 console.log 还是 winston / pino
  3. Linux 发行版
  4. 是否容器化

我可以直接给你对应正确的配置方案

0