在 Ubuntu 上 Node.js 日志缺失(不输出、看不到) 是一个很常见的问题,通常不是 Node 本身的问题,而是运行方式、输出目标、systemd、Docker 或日志配置导致的。下面按最常见原因 → 排查方法 → 解决方案给你一个系统性的说明。
systemd,但没配置日志输出现象
console.log() 没输出pm2 logs 没有journalctl 也看不到原因 systemd 默认 不会把 stdout/stderr 直接写到文件,而且 Node 进程可能被重定向或缓冲。
✅ 解决
# systemd service 文件
[Service]
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u your-service-name -f
或改成文件:
StandardOutput=append:/var/log/node/app.log
StandardError=append:/var/log/node/error.log
现象
nohup、&、pm2、docker 中没日志原因 Node.js 在非 TTY 环境下:
console.log 是 行缓冲✅ 解决
export NODE_ENV=production
或强制无缓冲:
node -e "process.stdout.setDefaultEncoding('utf8')"
或:
stdbuf -o0 node app.js
现象
> /dev/null 2>&1✅ 检查
ps aux | grep node
✅ 解决
/dev/null 重定向现象
pm2 logs 看不到✅ 检查
pm2 logs
pm2 logs app-name
✅ 确认日志路径
pm2 info app-name
✅ 解决
pm2 flush # 清空旧日志
pm2 restart all
现象
fs.writeFile✅ 检查
ls -l /var/log/node
✅ 解决
sudo mkdir -p /var/log/node
sudo chown -R $(whoami):$(whoami) /var/log/node
现象
docker logs 没内容原因
✅ 正确做法(Docker)
console.log('hello')
不要:
fs.writeFileSync('/app/log.txt', 'hello')
✅ 查看:
docker logs <container-id>
现象
✅ 解决
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
});
process.on('unhandledRejection', (err) => {
console.error('Unhandled Rejection:', err);
});
# 1. 是否真的在运行
ps aux | grep node
# 2. systemd 日志
journalctl -u your-service -f
# 3. PM2 日志
pm2 logs
# 4. Docker 日志
docker logs <container>
# 5. 是否被重定向
cat /proc/<pid>/fd/1
cat /proc/<pid>/fd/2
✅ 不要只用 console.log
推荐:
示例(pino):
const pino = require('pino');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty'
}
});
logger.info('Server started');
你可以直接贴出以下信息之一:
node app.js 还是 npm startconsole.log 还是日志库我可以 直接告诉你缺日志的精确原因和改法 ✅