2017-09-12 21 views
0

我正在调试从我的快速应用到我的网络上的另一个微服务的呼叫。我收到了401个错误,我需要获取完整的原始http日志以提供给我的安全团队进行分析。跟踪和记录从一个node.js服务器内部制作的http调用

我正在寻找一些关于跟踪来自我在Pivotal Cloud Foundry上部署的微服务的HTTP调用的建议。我一直在做一些研究,并且跨越了Zipkin和OpenTracing等工具。但是这些似乎更多的是关于调试延迟,可能不会显示HTTP日志。我也尝试过使用Morgan/Winston模块,但他们不跟踪内部呼叫。摩根目前正在使用注销基本的HTTP代码,但它不会从我的应用程序中接收我的呼叫,而只是从浏览器中向应用程序本身发出的呼叫。我需要获得完整的原始HTTP请求来协助安全团队。我正在使用morgan(STDOUT)的默认日志记录输出。我已经使用控制台记录了标题以查看标题,但希望以稍微更易读的格式将它们取出。

回答

1

要记录从Node.js服务器发送的内部HTTP请求,您可以创建代理Node.js服务器并使用Morgan记录所有请求。

首先,定义3个常数(或您的项目配置文件读取):

// The real API endpoint, such as "another micro-service" in your network 
const API = http://<real_server> 
// Proxy Node.js server running on localhost 
const LOGGER_ENDPOINT=http://localhost:3010 
// Flag, decide whether logger is enabled. 
const ENABLE_LOGGER=true 

其次,当你的Node.js服务器启动,同时启动记录程序服务器,如果ENABLE_LOGGER是真实的。记录器服务器只做一件事:记录请求并使用request模块将其转发给真实的API服务器。您可以使用Morgan来提供更具可读性的格式。

const request = require('request'); 
const morgan = require('morgan')(':method :url :status Cookie: :req[Cookie] :res[content-length] - :response-time ms'); 
... 
if (ENABLE_LOGGER && LOGGER_ENDPOINT) { 
    let loggerPort = 3010; 
    const logger = http.createServer((req, res) => { 
    morgan(req, res,() => { 
     req.pipe(request(API + req.url)).pipe(res); 
    }); 
    }); 
    logger.listen(loggerPort); 
} 

三,在你的Node.js服务器,发送API请求记录服务器时ENABLE_LOGGER是真实的,并直接发送API到真实服务器时ENABLE_LOGGER是假的。

let app = express(); // assume Express is used, but this strategy can be easily applied to other Node.js web framework. 
... 
let API_Endpoint = ENABLE_LOGGER ? LOGGER_ENDPOINT : API; 
app.set('API', API_Endpoint); 
... 
// When HTTP request is sent internally 
request(app.get('API') + '/some-url')... 
+0

非常感谢您的回复@shaochuancs。这正是我需要的:) –

相关问题