在 Node.js 项目中,日志权限主要涉及 文件系统的读写权限,而不是 Node.js 本身的特殊机制。下面从常见场景给你一个完整说明。
Node.js 里日志通常有两种:
直接写文件
fs.writeFileSync('logs/app.log', 'hello');
使用日志库
无论哪种方式,最终都会落到 Linux / Windows 文件权限上。
✅ 不要直接改日志文件权限,而是控制目录权限
mkdir -p /var/log/myapp
chown -R appuser:appuser /var/log/myapp
chmod 750 /var/log/myapp
750:owner 可读写执行,group 可读执行,其他无权限appuser:运行 Node.js 的用户查看当前运行用户:
ps aux | grep node
✅ 不要用 root 运行 Node 服务
sudo -u appuser node app.js
或使用:
User=Node.js 创建的文件权限受 umask 影响。
umask
默认通常是:
0022
表示新文件权限是:
666 - 022 = 644
✅ 推荐在启动脚本中设置:
umask 027
node app.js
这样日志文件权限为:
640
const winston = require('winston');
const { join } = require('path');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: '/var/log/myapp/app.log',
options: { mode: 0o640 } // 可选
})
]
});
⚠️ 注意:options.mode 不一定被所有 transport 支持
RUN chmod 777 /app/logs
RUN mkdir -p /app/logs && \
chown -R node:node /app/logs
USER node
或在 docker-compose 中:
volumes:
- ./logs:/app/logs
并确保宿主机目录权限正确。
| 项目 | 建议 |
|---|---|
| 日志目录 | /var/log/myapp |
| 运行用户 | 非 root |
| 目录权限 | 750 |
| 文件权限 | 640 |
| 日志库 | winston / pino |
| 切割 | logrotate |
| Docker | 使用非 root 用户 |
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 640 appuser appuser
}
# 1. 目录是否存在
ls -ld /var/log/myapp
# 2. 谁在运行 node
ps aux | grep node
# 3. 文件权限
ls -l /var/log/myapp
如果你愿意,可以告诉我:
我可以给你针对你环境的精确配置示例。