温馨提示×

为何nodejs linux无日志

小樊
44
2026-09-02 12:54:11
栏目: 编程语言

Node.js 在 Linux 上“没有日志” 通常不是 Node 本身不输出日志,而是日志去向、运行方式或配置出了问题。下面按常见原因逐一说明,你可以对照排查。


一、最常见的几个原因

1️⃣ 日志被重定向到了文件 / 黑洞

很多生产环境启动方式是:

node app.js > /dev/null 2>&1 &

或 systemd / pm2 / docker 配置中:

  • > /dev/null
  • 2>&1
  • log 被重定向到某个文件

✅ 检查:

ps aux | grep node

看启动命令有没有重定向。


2️⃣ 用了 PM2,但没看 PM2 日志

如果你用 PM2:

pm2 start app.js

日志不会直接打到终端,而是在:

pm2 logs

或:

~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log

✅ 正确查看方式:

pm2 logs
pm2 logs app

3️⃣ systemd 服务没配置 stdout 日志

如果你用 systemd:

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

Node 的 console.log 会进 journald,不是文件。

✅ 查看日志:

journalctl -u your-service -f

如果服务里写了:

StandardOutput=null

那就真的没日志了。


4️⃣ 代码里没有 console.log / logger

很多框架(Express / Nest / Koa)默认不打印请求日志。

例如:

app.get('/', (req, res) => {
  res.send('ok')
})

✅ 解决:

console.log('request received')

或使用:

  • winston
  • pino
  • morgan(HTTP 日志)

5️⃣ 异常被吞掉(错误不打印)

process.on('uncaughtException', () => {})
process.on('unhandledRejection', () => {})

✅ 至少保留:

process.on('uncaughtException', e => console.error(e))

6️⃣ Docker 没看容器日志

如果你在 Docker 里跑:

docker logs <container_id>

不要进容器里找文件日志。


二、快速自检清单 ✅

# 1. 看启动命令
ps aux | grep node

# 2. pm2
pm2 logs

# 3. systemd
journalctl -u 服务名 -f

# 4. docker
docker logs -f 容器名

# 5. 手动测试
node -e "console.log('hello')"

三、推荐的生产做法(避免“无日志”)

✅ 用日志库(不要只用 console)

npm i pino

✅ 明确输出位置

  • stdout(Linux 标准做法)
  • 或文件 + logrotate

✅ systemd 推荐配置

StandardOutput=journal
StandardError=journal

如果你愿意,可以把 启动方式(pm2 / systemd / docker / 直接 node)贴出来,我可以直接告诉你日志去哪了。

0