温馨提示×

Nodejs日志Ubuntu为何丢失

小樊
42
2026-07-21 19:29:47
栏目: 编程语言

Ubuntu 上运行 Node.js 时日志“丢失”,通常不是真的消失了,而是输出方式、系统配置或进程管理导致日志没有到达你预期的位置。下面按最常见原因 → 排查方法 → 解决方案来说明。


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

1️⃣ console.log 被 systemd / 容器吞掉

如果你用 systemdDocker 启动 Node.js:

console.log('hello')

✅ 实际是写到了 stdout
❌ 但你没去正确的地方看

systemd 查看日志

journalctl -u your-service-name -f

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


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

常见于:

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

或 systemd 配置:

StandardOutput=null

✅ 日志直接丢弃

✅ 解决:

StandardOutput=journal
StandardError=journal

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

例如:

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

但:

  • /var/log 需要 root
  • 或你用的是相对路径 "logs/app.log"

✅ 排查:

pwd
ls -l logs/

✅ 解决:

  • 用绝对路径
  • 或给目录权限
sudo chown -R $(whoami) /var/log/app

4️⃣ 程序异常退出,日志还没写

Node 是 异步 的:

console.log('start')
process.exit(1)

有些日志可能 还没 flush

✅ 解决:

process.on('exit', () => {
  console.log('exit')
})

或使用日志库(见下文)


5️⃣ PM2 日志没找对地方

如果你用 PM2

pm2 logs

日志默认在:

~/.pm2/logs/

❌ 不是你代码里写的文件


6️⃣ Docker 容器日志没挂载

Docker 中:

console.log('xxx')

✅ 在容器 stdout
❌ 但你没看 docker logs

docker logs 容器名

✅ 或挂载 volume:

-v /host/logs:/app/logs

二、快速自查清单 ✅

你可以按顺序检查:

  1. Node 是怎么启动的?

    • systemd?
    • pm2?
    • docker?
    • 手动 node app.js
  2. 日志是写到哪里的?

    • console.log
    • fs.writeFile
    • winston / pino
  3. 有没有重定向?

    ps aux | grep node
    
  4. 有没有权限?

    ls -ld 日志目录
    

三、推荐的正确做法(避免再丢)

✅ 用专业日志库(强烈推荐)

Winston 示例

const winston = require('winston')

const logger = winston.createLogger({
  transports: [
    new winston.transports.File({ filename: 'app.log' }),
    new winston.transports.Console()
  ]
})

logger.info('this will not lost')

✅ 自动 flush
✅ 支持按天切分
✅ 支持 systemd / docker


✅ systemd 推荐配置

[Service]
ExecStart=/usr/bin/node /app/app.js
StandardOutput=journal
StandardError=journal

查看:

journalctl -u app -f

四、一句话总结

Node.js 在 Ubuntu 上“日志丢失”,99% 是 stdout 没被接住、路径不对、权限不足或进程异常退出。

如果你愿意,可以把下面信息发我,我可以精确告诉你原因:

  • Node 启动方式(systemd / pm2 / docker)
  • 日志是怎么写的(代码)
  • 你说的“丢失”是指哪一类日志

0