Node.js 日志权限问题通常表现为:写不进日志文件、EACCES 错误、服务以 root 启动但日志属主混乱、容器里无法写日志等。下面按常见场景给你一套排查和解决办法。
Error: EACCES: permission denied, open '/var/log/app/app.log'
排查
ls -l /var/log/app/
whoami
解决
sudo mkdir -p /var/log/app
sudo chown -R youruser:youruser /var/log/app
sudo chmod 755 /var/log/app
如果你是 systemd 服务:
[Service]
User=node
Group=node
然后:
sudo chown -R node:node /var/log/app
PM2 示例:
pm2 start app.js --user node
Docker 示例:
RUN chown -R node:node /app/logs
USER node
❌ 错误写法:
fs.writeFileSync('/var/log/app/app.log', data)
✅ 正确写法:
const fs = require('fs');
const path = require('path');
const logDir = '/var/log/app';
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
以 winston 为例:
const winston = require('winston');
const { createLogger, transports } = winston;
createLogger({
transports: [
new transports.File({
filename: '/var/log/app/app.log'
})
]
});
确保:
journalctl -u yourapp
如果看到:
Permission denied
检查:
[Service]
ReadWritePaths=/var/log/app
✅ 推荐:日志打到 stdout / stderr
console.log('info')
Docker 自动收集:
docker logs container_name
K8s:
kubectl logs pod-name
✅ 日志目录统一:
/var/log/<app>/
✅ 不使用 root 跑 Node
✅ 容器里用 stdout
✅ 日志库统一(winston / pino)
如果你愿意,可以把:
发出来,我可以直接帮你定位 ✅