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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:42:18