温馨提示×

Ubuntu Nodejs日志为何不写

小樊
37
2026-08-05 10:13:55
栏目: 编程语言

Ubuntu 上 Node.js 日志不写 通常不是 Node 本身的问题,而是路径、权限、进程管理或日志重定向导致的。下面按最常见原因给你一套排查思路。


一、先确认:你说的“日志”是哪种?

不同场景原因不同:

  1. console.log / console.error
  2. 文件日志(fs.writeFile / winston / log4js)
  3. PM2 日志
  4. systemd 服务日志
  5. Docker 内 Node 日志

你可以先对号入座,也可以直接按下面顺序排查。


二、最常见原因 & 解决方案

✅ 1. 日志路径是相对路径(最容易踩坑)

fs.writeFileSync('./logs/app.log', 'test');

问题

  • 相对路径是 启动 Node 时的 cwd,不是 .js 文件所在目录
  • Ubuntu 下经常不一致

解决

const path = require('path');
const fs = require('fs');

const logPath = path.join(__dirname, 'logs/app.log');
fs.writeFileSync(logPath, 'test');

✅ 2. 目录不存在(不会自动创建)

fs.writeFileSync('/var/log/myapp/app.log', 'test');

❌ 不会写,也不会抛明显错误(有时)

解决

fs.mkdirSync('/var/log/myapp', { recursive: true });

✅ 3. 权限不足(Ubuntu 非常常见)

如果你用:

  • /var/log
  • /root
  • 非当前用户目录

检查

ls -ld /var/log/myapp

解决

sudo chown -R $USER:$USER /var/log/myapp

或(生产环境)

sudo chmod 755 /var/log/myapp

✅ 4. 用 PM2 启动,但看错地方

PM2 不会输出到你的文件

✅ 正确查看方式:

pm2 logs
pm2 logs app-name

✅ 日志位置:

~/.pm2/logs/

✅ 如果你希望写文件:

const fs = require('fs');
fs.writeFileSync('/path/to/log', data);

✅ 5. systemd 服务(最常见“没日志”)

如果你用 systemd 启动:

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

console.log 不会写文件 ✅ 日志在:

journalctl -u your-service-name -f

✅ 或显式重定向:

StandardOutput=append:/var/log/myapp/out.log
StandardError=append:/var/log/myapp/err.log

✅ 6. 异步写日志没 flush 就进程退出

fs.writeFile('a.log', 'data');
process.exit();

❌ 文件可能为空

解决

await fs.promises.writeFile('a.log', 'data');
process.exit();

或监听退出:

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

✅ 7. 日志被重定向到 /dev/null

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

✅ 检查启动命令


三、快速自检清单(90% 问题在这里)

在服务器上执行:

# 1. 当前目录
pwd

# 2. Node 启动目录
ls -l /proc/$(pgrep node)/cwd

# 3. 文件是否存在
ls -l /your/log/path

# 4. 权限
namei -l /your/log/path

四、推荐的生产日志方案(避免踩坑)

Winston + 绝对路径

const winston = require('winston');
const path = require('path');

const logger = winston.createLogger({
  transports: [
    new winston.transports.File({
      filename: path.join(__dirname, 'logs/app.log')
    })
  ]
});

或 systemd + journalctl(推荐)


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

你可以直接贴:

  1. Node 启动方式(pm2 / systemd / 手动)
  2. 日志代码示例
  3. Ubuntu 版本
  4. 是否报错(stderr)

我可以一步一步帮你精确到哪一行导致“日志不写”。

0