在 Linux 上给 Node.js 日志设置权限,通常要兼顾 安全、可写、便于排查问题 三个点。下面按常见场景说明。
推荐目录(避免权限混乱):
/var/log/your-app//srv/your-app/logs/不推荐:
/tmp(可能被清理)假设你的 Node.js 以 appuser 用户运行:
sudo mkdir -p /var/log/your-app
sudo chown -R appuser:appuser /var/log/your-app
sudo chmod 750 /var/log/your-app
说明:
750:属主可读写执行,组用户可读执行,其他无权限700Node.js 启动时自动创建日志文件时,权限受 umask 影响。
常见安全设置:
# 文件权限 640(属主读写,组只读)
sudo chmod 640 /var/log/your-app/*.log
如果你手动创建:
sudo touch /var/log/your-app/app.log
sudo chown appuser:appuser /var/log/your-app/app.log
sudo chmod 640 /var/log/your-app/app.log
查看 Node 运行用户:
ps -ef | grep node
原则:
root 跑 Node(安全风险)示例(用 systemd):
[Service]
User=appuser
Group=appuser
确保:
Winston 示例:
const winston = require('winston');
const path = require('path');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: '/var/log/your-app/app.log'
})
]
});
用 logrotate 防止日志爆盘:
sudo vim /etc/logrotate.d/your-app
示例:
/var/log/your-app/*.log {
daily
rotate 14
compress
missingok
notifempty
create 640 appuser appuser
sharedscripts
postrotate
systemctl reload your-app
endscript
}
❌ 权限不足
EACCES: permission denied, open '/var/log/your-app/app.log'
✅ 确认目录和文件属主是 Node 运行用户
❌ 用 root 跑 Node
✅ 用普通用户 + 最小权限
❌ 日志目录 777
✅ 太危险,避免
| 对象 | 权限 | 说明 |
|---|---|---|
| 日志目录 | 750 / 700 | Node 用户属主 |
| 日志文件 | 640 | 属主读写,组只读 |
| 运行用户 | 非 root | 安全第一 |
如果你用的是 Docker / PM2 / systemd / Kubernetes,可以告诉我,我可以给你更具体的配置示例。