如何在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
相关产品推荐
相关产品推荐

