如何在AWS SDK v3中实现与v2一致的调用日志功能?
在AWS SDK v3中实现与v2一致的SDK调用日志功能
问题描述
我在Node.js应用使用AWS SDK v2时,通过AWS.config.logger = console;可以获取所有AWS SDK调用的日志,格式如下:
[AWS s3 200 0.185s 0 retries] createMultipartUpload({ Bucket: 'js-sdk-test-bucket', Key: 'issues_1704' })
现在需要在AWS SDK v3中实现相同的日志功能。
实现方案
AWS SDK v3采用模块化设计,取消了全局AWS.config配置,需通过**中间件(Middleware)**实现日志功能,以下是两种可行方式:
1. 使用内置日志中间件(推荐)
SDK v3提供了@aws-sdk/util-middleware-logger工具包,可快速生成与v2格式一致的日志:
安装依赖
npm install @aws-sdk/client-s3 @aws-sdk/util-middleware-logger
代码实现
const { S3Client, CreateMultipartUploadCommand } = require("@aws-sdk/client-s3"); const { loggerMiddleware } = require("@aws-sdk/util-middleware-logger"); // 创建S3客户端 const s3Client = new S3Client({ region: "你的区域标识" }); // 给客户端添加日志中间件 s3Client.middlewareStack.add(loggerMiddleware({ logger: console }), { step: "finalizeRequest", name: "loggerMiddleware", }); // 测试API调用 const run = async () => { try { const command = new CreateMultipartUploadCommand({ Bucket: "js-sdk-test-bucket", Key: "issues_1704", }); await s3Client.send(command); } catch (err) { console.error("请求失败:", err); } }; run();
执行后会输出与v2格式一致的日志:
[AWS s3 200 0.185s 0 retries] createMultipartUpload({ Bucket: 'js-sdk-test-bucket', Key: 'issues_1704' })
2. 自定义日志中间件(按需调整)
如果需要完全自定义日志格式,可手动编写中间件:
const { S3Client, CreateMultipartUploadCommand } = require("@aws-sdk/client-s3"); // 自定义日志中间件 const customLogger = (options = { logger: console }) => (next) => async (args) => { const startTime = Date.now(); try { const response = await next(args); const duration = (Date.now() - startTime) / 1000; options.logger.log( `[AWS ${args.serviceName} ${response.$metadata.httpStatusCode} ${duration.toFixed(3)}s ${response.$metadata.retries} retries] ${args.commandName}(${JSON.stringify(args.input)})` ); return response; } catch (error) { const duration = (Date.now() - startTime) / 1000; options.logger.error( `[AWS ${args.serviceName} ${error.$metadata?.httpStatusCode || "ERROR"} ${duration.toFixed(3)}s ${error.$metadata?.retries || 0} retries] ${args.commandName}(${JSON.stringify(args.input)})` ); throw error; } }; // 绑定中间件到客户端 const s3Client = new S3Client({ region: "你的区域标识" }); s3Client.middlewareStack.add(customLogger(), { step: "finalizeRequest", name: "customLoggerMiddleware", }); // 执行API调用 run();
关键说明
- 中间件需添加到
finalizeRequest阶段,确保能捕获请求完成后的状态、耗时等信息 - 所有AWS服务客户端都可通过
middlewareStack.add()添加日志中间件,可封装成工具函数实现全局日志配置
内容的提问来源于stack exchange,提问作者Rajan Middha
相关产品推荐
相关产品推荐

