node.js - 跟踪和记录从 node.js 服务器内部发出的 http 调用

标签 node.js http logging cloud microservices

我正在调试从我的 Express 应用程序向我网络上的另一个微服务发出的调用。我收到 401 错误,我需要获取完整的原始 http 日志以提供给我的安全团队进行分析。

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

最佳答案

要记录从 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 服务器中,当 ENABLE_LOGGER 为真时,将 API 请求发送到记录服务器,当 ENABLE_LOGGER 为假时,将 API 直接发送到真实服务器。

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')... 

关于node.js - 跟踪和记录从 node.js 服务器内部发出的 http 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185813/

相关文章:

node.js - 在生产模式下无法访问我存储个人资料图片的路径

python - Facebook webhook 多次调用同一条消息?

javascript - 使用 Angular 获取数据 API 调用时出错

javascript - Cors 似乎在我的 Node 服务器上默认启用。我错过了什么吗?

node.js - 使用 http 基本身份验证从应用程序获取请求 (node.js)

javascript - 在 JS 中通过函数传递变量的最佳方法

javascript - 记录javascript错误

javascript - 使用路线javascript中的id从数据库中删除项目

azure - 有没有办法从外部或浏览器访问/获取 AKS(Azure kubernetes 服务)的应用程序日志?

java - Storm Bolt 始终记录到worker.log