Ubuntu 上 Node.js 日志不写 通常不是 Node 本身的问题,而是路径、权限、进程管理或日志重定向导致的。下面按最常见原因给你一套排查思路。
不同场景原因不同:
你可以先对号入座,也可以直接按下面顺序排查。
fs.writeFileSync('./logs/app.log', 'test');
问题
.js 文件所在目录✅ 解决
const path = require('path');
const fs = require('fs');
const logPath = path.join(__dirname, 'logs/app.log');
fs.writeFileSync(logPath, 'test');
fs.writeFileSync('/var/log/myapp/app.log', 'test');
❌ 不会写,也不会抛明显错误(有时)
✅ 解决
fs.mkdirSync('/var/log/myapp', { recursive: true });
如果你用:
/var/log/root✅ 检查
ls -ld /var/log/myapp
✅ 解决
sudo chown -R $USER:$USER /var/log/myapp
或(生产环境)
sudo chmod 755 /var/log/myapp
PM2 不会输出到你的文件
✅ 正确查看方式:
pm2 logs
pm2 logs app-name
✅ 日志位置:
~/.pm2/logs/
✅ 如果你希望写文件:
const fs = require('fs');
fs.writeFileSync('/path/to/log', data);
如果你用 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
fs.writeFile('a.log', 'data');
process.exit();
❌ 文件可能为空
✅ 解决
await fs.promises.writeFile('a.log', 'data');
process.exit();
或监听退出:
process.on('exit', () => {});
node app.js > /dev/null 2>&1
✅ 检查启动命令
在服务器上执行:
# 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(推荐)
你可以直接贴:
我可以一步一步帮你精确到哪一行导致“日志不写”。