在 Linux 下使用 Node.js 写日志时,日志文件的权限问题通常出现在以下几个方面:
下面按常见场景说明。
root 运行 → 日志通常是 root:rootwww / node / 普通用户运行 → 日志属于该用户查看:
ps -ef | grep node
ls -l /var/log/your-app/
Node.js 创建文件时受 umask 影响:
fs.writeFileSync('app.log', 'hello');
默认 umask 通常是 022:
644755修改 umask:
umask 002
node app.js
或在代码中:
process.umask(0o002);
const fs = require('fs');
fs.writeFileSync('app.log', data, { mode: 0o664 });
⚠️ 只对新文件有效,已存在文件不会变
winston 本身 不直接支持 mode,依赖系统 umask
const winston = require('winston');
const { createLogger, transports } = winston;
createLogger({
transports: [
new transports.File({
filename: '/var/log/app/app.log'
})
]
});
✅ 解决方式:
chown app:app /var/log/app
chmod 775 /var/log/app
umask 002
const pino = require('pino');
const logger = pino({
level: 'info'
}, fs.createWriteStream('/var/log/app/app.log'));
权限仍由 umask 决定
PM2 默认以 启动用户 运行
pm2 start app.js
日志位置:
~/.pm2/logs/
修改日志目录权限:
sudo chown -R app:app /var/log/app
PM2 启动指定用户:
pm2 start app.js --run-as-user app --run-as-group app
EACCES✅ 不要多个进程直接写同一文件
方案:
pino + 日志轮转logrotate/var/log/app/*.log {
daily
rotate 7
compress
missingok
notifempty
create 664 app app
sharedscripts
postrotate
pm2 reload all
endscript
}
✅ 日志目录提前建好
✅ 明确运行用户
✅ 使用 umask 控制默认权限
✅ 不要 root 跑 Node
✅ 用 logrotate 管理
✅ 多进程用日志服务,不要抢写文件
如果你愿意,可以告诉我:
EACCES ?)我可以直接给你一套可用配置。