下面按「常见场景 + 解决办法」给你一个 Debian 上 Node.js 日志权限问题的速查指南。
EACCES: permission deniedsudo node 能写,普通用户不能写例如:
/var/log/myapp/
属主是 root,但 Node 用 www-data 或普通用户运行。
检查:
ls -ld /var/log/myapp
ls -l /var/log/myapp/app.log
解决:
sudo chown -R myuser:myuser /var/log/myapp
drwxr-xr-x root root
其他用户不可写。
解决:
sudo chmod 755 /var/log/myapp
# 或只给运行用户
sudo chmod 750 /var/log/myapp
如果你用 systemd 启动 Node:
[Service]
User=www-data
但日志目录是 root 的,就会失败。
正确做法:
sudo mkdir -p /var/log/myapp
sudo chown -R www-data:www-data /var/log/myapp
如 winston、pino:
new winston.transports.File({
filename: '/var/log/myapp/app.log'
})
如果 目录不存在或不可写,直接崩。
✅ 建议:
fs.mkdirSync('/var/log/myapp', { recursive: true })
PM2 默认用 启动它的用户 跑。
如果你:
sudo pm2 start app.js
日志就可能是 root 创建的。
✅ 推荐:
sudo chown -R youruser:youruser ~/.pm2
pm2 start app.js
✅ 不要写 /var/log 根目录 ✅ 给应用单独目录
/var/log/myapp/
✅ 用非 root 用户运行 Node
User=node
✅ 日志轮转(logrotate)
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
}
# 当前 Node 进程用户
ps aux | grep node
# 文件权限
namei -l /var/log/myapp/app.log
# 测试写权限
sudo -u www-data touch /var/log/myapp/test
如果你愿意,可以把下面信息发我,我能精准定位:
ls -l 结果我可以帮你写一份最小可用权限方案。