下面按常见场景给你一个排查 & 解决思路,基本能覆盖 90% 的「JS 日志在 Linux 上写不进去 / 权限报错」问题。
EACCES: permission deniedENOSPC: no space left on device(有时也是权限)fs.writeFileSync('/var/log/app/app.log', 'hello');
Error: EACCES: permission denied, open '/var/log/app/app.log'
ls -ld /var/log/app
sudo mkdir -p /var/log/app
sudo chown -R appuser:appuser /var/log/app
sudo chmod 755 /var/log/app
✅ 推荐:日志目录 owner 设为运行 Node 的用户
pm2 start app.js
PM2 可能用:
rootps -ef | grep node
sudo chown -R $(whoami) /var/log/app
或指定用户启动:
pm2 start app.js --name app --run-as-user appuser
ls -l /var/log/app/app.log
sudo chmod 644 /var/log/app/app.log
或干脆删掉让程序重建:
sudo rm /var/log/app/app.log
getenforce
如果是 Enforcing,可能是 SELinux 拦截。
sudo setenforce 0
semanage fcontext -a -t httpd_log_t "/var/log/app(/.*)?"
restorecon -Rv /var/log/app
RUN mkdir -p /app/logs && chown -R node:node /app/logs
USER node
docker run -v $(pwd)/logs:/app/logs --user $(id -u):$(id -g) app
new winston.transports.File({
filename: '/var/log/app/app.log'
})
✅ 原则:
/var/log/app/
❌ /root/app.log
path.join(__dirname, '../logs/app.log')
# 1. 目录是否存在
ls -ld /var/log/app
# 2. 进程用户
ps -ef | grep node
# 3. 权限
namei -l /var/log/app/app.log
# 4. SELinux
getenforce
如果你愿意,可以直接贴:
我可以直接帮你定位到具体权限点。