温馨提示×

JS日志Linux权限问题

小樊
34
2026-07-18 19:01:00
栏目: 编程语言

下面按常见场景给你一个排查 & 解决思路,基本能覆盖 90% 的「JS 日志在 Linux 上写不进去 / 权限报错」问题。


一、常见报错现象

  • EACCES: permission denied
  • ENOSPC: no space left on device(有时也是权限)
  • 日志文件或目录 没有生成
  • Docker / PM2 / Nginx 里 JS 程序写不了日志

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

✅ 1. 日志目录没有写权限(最常见)

示例

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 的用户


✅ 2. Node / JS 进程用户不是你以为的用户

PM2 场景

pm2 start app.js

PM2 可能用:

  • root
  • 或当前 shell 用户

查看进程用户

ps -ef | grep node

解决

sudo chown -R $(whoami) /var/log/app

或指定用户启动:

pm2 start app.js --name app --run-as-user appuser

✅ 3. 日志文件已存在,但权限不对

ls -l /var/log/app/app.log

解决

sudo chmod 644 /var/log/app/app.log

或干脆删掉让程序重建:

sudo rm /var/log/app/app.log

✅ 4. SELinux 导致(CentOS / RHEL 常见)

排查

getenforce

如果是 Enforcing,可能是 SELinux 拦截。

临时验证

sudo setenforce 0

正确做法(推荐)

semanage fcontext -a -t httpd_log_t "/var/log/app(/.*)?"
restorecon -Rv /var/log/app

✅ 5. Docker 里写日志权限问题

问题

  • 容器内用 root
  • 挂载目录是宿主机 root 权限

解决方式 1(推荐)

RUN mkdir -p /app/logs && chown -R node:node /app/logs
USER node

解决方式 2

docker run -v $(pwd)/logs:/app/logs --user $(id -u):$(id -g) app

✅ 6. 使用 winston / pino 等日志库

示例(winston)

new winston.transports.File({
  filename: '/var/log/app/app.log'
})

✅ 原则:

  • 目录必须存在
  • 进程用户必须可写

三、推荐的最佳实践 ✅

✅ 1. 日志目录统一

/var/log/app/

✅ 2. 不要写 root 目录

/root/app.log

✅ 3. 用相对路径(开发环境)

path.join(__dirname, '../logs/app.log')

✅ 4. 生产环境日志方案

  • PM2 + logrotate
  • 或 stdout + Docker logging driver
  • 或 ELK / Loki

四、快速自查清单 ✅

# 1. 目录是否存在
ls -ld /var/log/app

# 2. 进程用户
ps -ef | grep node

# 3. 权限
namei -l /var/log/app/app.log

# 4. SELinux
getenforce

如果你愿意,可以直接贴:

  • ❌ 报错信息
  • ✅ 日志路径
  • ✅ 启动方式(PM2 / Docker / systemd / 裸跑)

我可以直接帮你定位到具体权限点

0