在 Linux 上运行 Node.js 时,日志权限问题通常表现为:
EACCES: permission deniedroot,普通用户跑的 Node 读不了/写不了pm2 / systemd 启动时日志权限不对下面按常见场景给你解决方案。
whoami
ls -l /path/to/logs
ps aux | grep node
确认:
假设日志在:
/var/log/myapp/
sudo chown -R nodeuser:nodeuser /var/log/myapp
或给写权限(不推荐长期用):
sudo chmod 755 /var/log/myapp
✅ 推荐:让日志目录属主 = Node 运行用户
如果你曾用:
sudo node app.js
日志文件会变成:
-rw-r--r-- 1 root root app.log
普通用户再跑就写不进去。
sudo chown nodeuser:nodeuser /var/log/myapp/app.log
✅ 原则:不要用 root 跑 Node
如果你的服务是:
systemctl start mynode
systemd 默认用:
User=root
编辑 service 文件:
[Service]
User=nodeuser
Group=nodeuser
然后:
sudo systemctl daemon-reload
sudo systemctl restart mynode
并确保日志目录属主一致。
pm2 默认日志在:
~/.pm2/logs/
如果你用 sudo pm2 启动过,就会出权限问题。
sudo chown -R $USER:$USER ~/.pm2
✅ 永远不要 sudo pm2 start
Docker 里 Node 默认是 root 或 node 用户。
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN chown -R node:node /app
USER node
CMD ["node", "app.js"]
挂载日志时:
-v /host/logs:/app/logs
主机目录:
sudo chown -R 1000:1000 /host/logs
(1000 通常是 node 用户)
const fs = require('fs');
const path = require('path');
const logDir = '/var/log/myapp';
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
推荐:
winstonpinobunyansudo nodeUSER node你可以直接发我:
ls -l 结果我可以精准定位给你最小修改方案。