Node.js 在 Linux 下日志为空,通常不是 Node 本身的问题,而是运行环境、启动方式或输出去向的问题。下面按最常见 → 较少见逐一排查。
pm2 / nohup / systemd 启动,没有重定向 stdoutNode.js 的 console.log() 输出到 stdout,而 Linux 后台运行时会把 stdout 丢弃或不显示。
nohup node app.js &
# 或
pm2 start app.js
你可能看不到任何日志,因为:
nohup 默认写 nohup.outpm2 日志在 ~/.pm2/logs/systemd 日志在 journalctl✅ 正确做法
pm2:
pm2 logs
nohup:
nohup node app.js > app.log 2>&1 &
systemd:
[Service]
StandardOutput=journal
StandardError=journal
如果你用 systemd 启动 Node:
sudo journalctl -u your-service-name -f
而不是去 /var/log/ 找文件。
例如 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()
]
});
NODE_ENV=production 关闭了日志某些框架(如 NestJS、Egg.js)在 production 环境会:
检查:
echo $NODE_ENV
临时测试:
NODE_ENV=development node app.js
Node.js 在非 TTY 下 stdout 是块缓冲。
✅ 测试:
setInterval(() => {
console.log('still alive');
}, 1000);
✅ 强制刷新:
process.stdout.write('log\n');
或:
export NODE_DEBUG=*
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 只捕获 stdout/stderr。
❌ 错误:
fs.writeFileSync('/app/app.log', data);
✅ 正确:
console.log(data);
或:
docker logs <container_id>
请逐条确认:
console.log 还是日志库?pm2 / systemd / nohup / docker?NODE_ENV=production?__dirname?setInterval(() => {
console.log(new Date().toISOString(), 'hello linux');
}, 1000);
运行:
node test.js
✅ 如果有输出 → Node 正常
❌ 没输出 → 环境或启动方式问题
如果你愿意,可以把下面信息发我,我可以直接帮你定位到底是哪一条:
console.log 还是 winston / pino我可以直接给你对应正确的配置方案。