温馨提示×

nodejs linux日志为何不写

小樊
36
2026-09-29 17:41:56
栏目: 编程语言

Node.js 在 Linux 上“日志不写”是一个很常见的问题,通常不是 Node 本身不输出,而是输出位置、权限、缓冲、进程管理方式导致的。下面按最常见原因给你排查清单。


一、你以为是“日志没写”,其实是写到了别的地方

1. 日志写到了 stdout / stderr,但你看错地方

Node.js 默认:

  • console.log → stdout
  • console.error → stderr

如果你用:

node app.js

日志在终端

但如果是:

node app.js &

或

nohup node app.js &

日志可能:

  • 被丢弃
  • 写到 nohup.out
  • 或根本没有重定向

✅ 正确做法:

node app.js > app.log 2>&1 &

二、用 pm2 / systemd 但没看对应日志

1. pm2

pm2 logs

或

pm2 logs app

如果你以为 console.log 会写文件,那是错的。


2. systemd(最常见坑)

如果你用:

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

日志在:

journalctl -u your-service -f

✅ 不会写到你自己的文件,除非你:

fs.appendFileSync('/var/log/app.log', msg)

三、文件权限问题(Linux 特有)

现象

  • 不报错
  • 文件不生成
  • 或只有 root 能写

常见原因:

/var/log/app.log

Node 进程用户(如 www / node)没写权限

✅ 检查:

ps aux | grep node
ls -l /var/log

✅ 修复:

sudo chown node:node /var/log/app.log

四、日志被缓冲,没 flush(非常常见)

原因

  • 使用 fs.writeFile(异步)
  • 进程被 kill -9
  • 或 Docker / 容器退出太快

✅ 解决:

  • 用 fs.appendFileSync
  • 或:
process.on('exit', () => {})

五、用了日志库但配置错了

例如 winston:

new winston.transports.File({ filename: 'app.log' })

但:

  • 路径是相对路径
  • 实际工作目录不是你以为的目录

✅ 用绝对路径:

path.join(__dirname, 'app.log')

六、Docker / 容器环境

日志其实写了,但你没看

docker logs 容器名

✅ 容器内不要写文件,写 stdout:

console.log('hello')

七、程序根本没运行到写日志的地方

自查:

console.log('start')

如果连这个都没有:

  • 启动报错
  • 端口占用
  • 配置文件读取失败

看:

journalctl -u xxx
pm2 logs
docker logs

快速自查清单 ✅

  • [ ] 用的什么方式启动(node / pm2 / systemd / docker)
  • [ ] 日志是 console 还是 fs
  • [ ] 路径是绝对还是相对
  • [ ] 进程用户有没有写权限
  • [ ] 是否看了正确的日志位置

如果你愿意,可以直接贴:

  • 启动方式
  • 日志代码
  • 运行环境(CentOS / Ubuntu / Docker / pm2)

我可以精准告诉你为什么没写。

0 踩