You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS SDK v3 for Node中开启Wire Logging及记录完整HTTP请求响应

在Node.js环境下使用AWS SDK v3开启Wire Logging及记录完整HTTP请求响应

方式一:通过自定义HTTP拦截器捕获完整请求/响应

AWS SDK v3采用模块化设计,要获取Wire级别的HTTP细节(完整请求、响应内容),最可靠的方式是实现自定义HTTP拦截器,在请求发送前和响应返回后打印全量信息。

步骤1:编写拦截器函数

const { HttpRequest } = require("@aws-sdk/protocol-http");
const { HttpResponse } = require("@aws-sdk/protocol-http");

const wireLoggingInterceptor = () => {
  return async (next) => async (args) => {
    // 记录请求详情
    if (args.request instanceof HttpRequest) {
      console.log("=== AWS 请求开始 ===");
      console.log(`请求方法: ${args.request.method}`);
      console.log(`请求URL: ${args.request.protocol}//${args.request.hostname}${args.request.path}`);
      console.log(`请求头: ${JSON.stringify(args.request.headers, null, 2)}`);
      if (args.request.body) {
        // 读取请求体(若为大文件流,建议只记录长度而非内容)
        const bodyContent = await args.request.body.transformToString();
        console.log(`请求体: ${bodyContent}`);
        // 重置请求体,避免后续流程无法读取
        args.request.body = bodyContent;
      }
      console.log("=== AWS 请求结束 ===");
    }

    // 发送请求并获取响应
    const result = await next(args);

    // 记录响应详情
    if (result.response instanceof HttpResponse) {
      console.log("=== AWS 响应开始 ===");
      console.log(`状态码: ${result.response.statusCode}`);
      console.log(`响应头: ${JSON.stringify(result.response.headers, null, 2)}`);
      if (result.response.body) {
        const bodyContent = await result.response.body.transformToString();
        console.log(`响应体: ${bodyContent}`);
      }
      console.log("=== AWS 响应结束 ===");
    }

    return result;
  };
};

步骤2:在客户端配置中注入拦截器

以S3客户端为例,将拦截器添加到请求处理器的拦截器数组中:

const { S3Client } = require("@aws-sdk/client-s3");
const { NodeHttpHandler } = require("@aws-sdk/node-http-handler");

const s3Client = new S3Client({
  requestHandler: new NodeHttpHandler({
    interceptors: [wireLoggingInterceptor()],
  }),
  region: "us-east-1", // 替换为你的AWS区域
  // 其他配置(如凭证、超时等)
});

方式二:利用SDK内置日志系统(基础Wire日志)

若仅需基础Wire级日志(无需完整请求/响应体),可通过配置SDK日志级别和自定义Logger实现:

步骤1:创建自定义Logger

const { ConsoleLogger } = require("@aws-sdk/util-logger");

// 日志级别设为DEBUG,包含Wire相关的基础信息
const customLogger = new ConsoleLogger("DEBUG", {
  formatter: (logEntry) => `[${logEntry.timestamp}] ${logEntry.level}: ${logEntry.message}`,
});

步骤2:在客户端中配置日志参数

const { S3Client } = require("@aws-sdk/client-s3");

const s3Client = new S3Client({
  logger: customLogger,
  logLevel: "DEBUG",
  region: "us-east-1",
});

这种方式会打印SDK内部DEBUG级日志,包含请求URL、状态码等基础Wire信息,但不会输出完整请求/响应体,适合快速排查简单请求问题。

注意事项

  • 生产环境谨慎开启完整Wire Logging,避免泄露请求/响应中的敏感数据(如密钥、用户隐私信息)。
  • 处理大文件流请求时,直接读取请求体会消耗大量内存,建议仅记录流长度等元数据。
  • 不同HTTP处理器(如NodeHttpHandler和FetchHttpHandler)的拦截器实现略有差异,上述示例基于NodeHttpHandler。

内容的提问来源于stack exchange,提问作者Rich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:52:42