在 Debian 下遇到 JS 日志写入权限被拒绝(Permission denied),通常是进程用户没有写日志文件的权限或路径不存在。可以按下面步骤排查和解决。
Error: EACCES: permission denied, open '/var/log/app/app.log'
说明:
/var/log/app/app.logps aux | grep node
例如:
www-data 1234 node app.js
说明是 www-data 用户在跑。
sudo mkdir -p /var/log/app
sudo chown -R www-data:www-data /var/log/app
sudo chmod 755 /var/log/app
如果是当前用户运行:
sudo chown -R $USER:$USER /var/log/app
ls -l /var/log/app/app.log
修复:
sudo chown www-data:www-data /var/log/app/app.log
sudo chmod 644 /var/log/app/app.log
避免系统目录权限问题:
mkdir -p ~/logs
JS 中:
const logFile = '/home/youruser/logs/app.log';
如果你用 systemd 启动 Node:
sudo nano /etc/systemd/system/myapp.service
确保:
[Service]
User=www-data
Group=www-data
然后:
sudo systemctl daemon-reexec
sudo systemctl restart myapp
检查:
sudo aa-status
如果是 AppArmor 限制:
sudo nano /etc/apparmor.d/usr.bin.node
或临时测试:
sudo systemctl stop apparmor
✅ 不要直接写 /var/log
✅ 用:
/var/log/<your-app>/
/home/user/logs/
✅ 用日志库(避免手写 fs):
winstonpinolog4jsconst winston = require('winston');
const path = require('path');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: path.join(__dirname, 'logs/app.log')
})
]
});
如果你能贴出:
我可以给你精确到命令级的解决方案。