创建日志目录
sudo mkdir -p /var/log/nodejs-app # 推荐存放在/var/log下
sudo chown -R node:node /var/log/nodejs-app # 确保Node.js运行用户(如node)拥有权限
sudo chmod -R 750 /var/log/nodejs-app # 目录权限:所有者可读写执行,组可读执行,其他无权限
配置Node.js应用
在代码中指定日志路径(以Winston为例):
const winston = require('winston');
const logger = winston.createLogger({
transports: [
new winston.transports.File({ filename: '/var/log/nodejs-app/error.log', level: 'error' }),
new winston.transports.File({ filename: '/var/log/nodejs-app/combined.log' })
]
});
文件级权限细化
640
(所有者可读写,组可读,其他无权限):sudo chmod 640 /var/log/nodejs-app/error.log
sudo chown node:adm /var/log/nodejs-app/error.log # 组可设为adm(系统管理员组)
SELinux/AppArmor配置
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/log/nodejs-app(/.*)?"
sudo restorecon -Rv /var/log/nodejs-app
/etc/apparmor.d/usr.sbin.node
,添加:/var/log/nodejs-app/ r,
/var/log/nodejs-app/** rwk,
然后重启AppArmor:sudo systemctl reload apparmor
日志轮转管理
使用logrotate
自动归档日志(创建/etc/logrotate.d/nodejs-app
):
/var/log/nodejs-app/*.log {
daily
rotate 7
compress
missingok
create 640 node node
postrotate
[ -f /var/run/nodejs-app.pid ] && kill -USR1 `cat /var/run/nodejs-app.pid`
endscript
}
777
等宽松权限。nodeapp
),而非直接使用root
。ls -l /var/log/nodejs-app
定期检查权限,确保无异常。sudo systemctl restart nodejs-app
tail -f /var/log/nodejs-app/error.log
strace
定位具体权限问题:sudo strace -e trace=open node app.js 2>&1 | grep /var/log/nodejs-app