温馨提示×

Ubuntu Nodejs日志为何缺失

小樊
41
2026-08-05 09:37:53
栏目: 编程语言

在 Ubuntu 上 Node.js 日志缺失(不输出、看不到) 是一个很常见的问题,通常不是 Node 本身的问题,而是运行方式、输出目标、systemd、Docker 或日志配置导致的。下面按最常见原因 → 排查方法 → 解决方案给你一个系统性的说明。


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

1️⃣ 使用了 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

2️⃣ stdout 被缓冲(后台运行最常见)

现象

  • 本地运行有日志
  • nohup&pm2docker 中没日志

原因 Node.js 在非 TTY 环境下:

  • console.log行缓冲
  • 如果进程异常退出,缓冲区没刷

解决

export NODE_ENV=production

或强制无缓冲:

node -e "process.stdout.setDefaultEncoding('utf8')"

或:

stdbuf -o0 node app.js

3️⃣ 日志被重定向到 /dev/null

现象

  • 启动脚本里有 > /dev/null 2>&1
  • 完全看不到任何输出

检查

ps aux | grep node

解决

  • 删除 /dev/null 重定向
  • 或改为真实日志文件

4️⃣ PM2 没有正确查看日志

现象

  • 程序在跑
  • pm2 logs 看不到

检查

pm2 logs
pm2 logs app-name

确认日志路径

pm2 info app-name

解决

pm2 flush        # 清空旧日志
pm2 restart all

5️⃣ 日志写到文件,但路径不对 / 没权限

现象

  • 代码里写了 fs.writeFile
  • 文件不存在

检查

ls -l /var/log/node

解决

sudo mkdir -p /var/log/node
sudo chown -R $(whoami):$(whoami) /var/log/node

6️⃣ Docker 中日志缺失

现象

  • Docker 容器在跑
  • docker logs 没内容

原因

  • 日志写到了文件而不是 stdout
  • 或进程后台运行

正确做法(Docker)

console.log('hello')

不要:

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

✅ 查看:

docker logs <container-id>

7️⃣ Node 进程异常退出,日志还没来得及写

现象

  • 启动即退出
  • 没有任何日志

解决

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

三、推荐的 Node.js 日志方案(生产环境)

不要只用 console.log

推荐:

  • winston
  • pino(最快)

示例(pino):

const pino = require('pino');
const logger = pino({
  level: 'info',
  transport: {
    target: 'pino-pretty'
  }
});

logger.info('Server started');

四、如果你愿意,我可以直接帮你定位

你可以直接贴出以下信息之一:

  1. 启动方式(systemd / pm2 / docker / bash)
  2. node app.js 还是 npm start
  3. 是否使用 console.log 还是日志库
  4. Ubuntu 版本

我可以 直接告诉你缺日志的精确原因和改法

0