我最终得到的是 Peter Lyons 解决方案的一个版本(我已经从几个地方剪切了以下内容,所以它可能实际上并没有运行;这个想法虽然有效):
var logger = new (winston.Logger)();
logger.add(winston.transports.Console, {
timestamp: true
});
// start server and downgrade user
httpsServer.listen(443, function() {
logger.info('Ready on port 443');
fs.stat(__filename, function(err, stats) {
fs.chownSync('stdouterr.log',stats.uid,stats.gid);
process.setgid(stats.gid);
process.setuid(stats.uid);
logger.add(winston.transports.File, {
filename: 'mylogfile.log',
handleExceptions: true
});
logger.info('downgraded to non-root uid', {"uid":stats.uid});
});
});
当我成功绑定到端口 443 时,我会记录下来。logger
是一个仅配置了控制台输出的 winston 记录器(通过使用启动节点将其重定向到 stdouterr.log 文件node app.js >> stdouterr.log 2>&1
)。所以这个日志信息只出现在stdouterr.log
.
然后我确定当前文件的所有者并 chown stdouterr.log 由该用户拥有。然后我设置当前进程的gid和uid(删除权限部分)。
然后我将我的文件日志添加到winston logger。
最后,我登录说我已经降级了用户。此消息同时出现在stdouterr.log
和mylogfile.log
中。
不像我希望的那么漂亮(进程以 root 身份运行时没有文件日志记录),但这意味着日志文件易于保护和管理。