获取Request ID

对象存储OSS为接收到的每个请求分配唯一的服务器请求ID,作为关联各类日志信息的标识符。当您在使用OSS过程中遇到错误且希望阿里云技术支持提供协助时,需要提交失败请求的Request ID,以便技术支持快速定位并解决问题。本文介绍获取Request ID的多种方式。

通过SDK获取Request ID

以下仅列举常见SDK获取Request ID的代码示例。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        String filePath= "D:\\localpath\\examplefile.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);
            
            // 上传文件。
            PutObjectResult result = ossClient.putObject(putObjectRequest);           
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Model\StyleConfig;
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称。
$bucket= "examplebucket";
try{
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    $result = $ossClient->getObject($bucket, "demo.txt");
} catch(OssException $e) {
    printf($e->getMessage() . "\n");
    printf($e->getRequestId() . "\n");
}
const OSS = require('ali-oss')
const path=require("path")

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填写Bucket名称。
  bucket: 'examplebucket',
});

// 自定义请求头
const headers = {
  // 指定Object的存储类型。
  'x-oss-storage-class': 'Standard',
  // 指定Object的访问权限。
  'x-oss-object-acl': 'private',
  // 通过文件URL访问文件时,指定以附件形式下载文件,下载后的文件名称定义为example.txt。
  'Content-Disposition': 'attachment; filename="example.txt"',
  // 设置Object的标签,可同时设置多个标签。
  'x-oss-tagging': 'Tag1=1&Tag2=2',
  // 指定PutObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。
  'x-oss-forbid-overwrite': 'true',
};

async function put () {
  try {
    // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
    // 如果本地文件的完整路径中未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    const result = await client.put('exampleobject.txt', path.normalize('D:\\localpath\\examplefile.txt')
    // 自定义headers
    ,{headers}
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

try:
    // 填写下载的文件名称,例如exampleobject.txt。
    stream = bucket.get_object('exampleobject.txt')
except oss2.exceptions.NoSuchKey as e:
    print('status={0}, request_id={1}'.format(e.status, e.request_id))            
package main

import (
	"fmt"
	"net/http"
	"os"
	"strings"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

// 错误处理函数。
func HandleError(err error) {
	fmt.Println("Error:", err)
	os.Exit(-1)
}

func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		HandleError(err)
	}
	// 填写存储空间名称,例如examplebucket。
	bucketName := "examplebucket"
	// 填写Object名称,例如exampleobject.txt。
	objectName := "exampleobject.txt"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		HandleError(err)
	}
	var responseHeader http.Header
	// 上传字符串。
	err = bucket.PutObject(objectName, strings.NewReader("Hello OSS"), oss.GetResponseHeader(&responseHeader))
	if err != nil {
		if _, ok := err.(oss.ServiceError); ok {
			// err是oss.ServiceError类型。
			fmt.Println("Error Message:", err.(oss.ServiceError).Message)
			fmt.Println("Error Code:", err.(oss.ServiceError).Code)
			fmt.Println("Request ID:", err.(oss.ServiceError).RequestID)
			fmt.Println("Host ID:", err.(oss.ServiceError).HostID)
		} else {
			// err不是oss.ServiceError类型。
			fmt.Println("Error:", err)
			os.Exit(-1)
		}
	}

	requestId := oss.GetRequestId(responseHeader)
	fmt.Println("Request ID:", requestId)
}

通过浏览器直接访问OSS文件时获取Request ID

您可以通过浏览器直接访问OSS文件时,您可以参考如下步骤获取Request ID。

  1. Windows系统为例,在浏览器页面按F12键,打开开发者工具页面。

  2. 在开发者工具页面,单击Network

  3. 在开发者工具页面,单击Name页签,选中目标文件。

  4. 单击Headers页签,在Response Headers区域,从x-oss-request-id获取对应操作的Request ID。

浏览器获取

通过实时日志获取Request ID

您可以通过OSS控制台实时查询Bucket、Object级别的各类请求日志,请求日志中包含Request ID的信息。

  1. 登录OSS管理控制台

  2. 单击左侧导航栏的Bucket列表,然后单击目标Bucket名称。

  3. 选择日志管理 > 实时查询

  4. Ctrl+F键,搜索request_id实时日志

通过ossutil工具获取Request ID

运行ossutil工具的命令时,在返回日志中获取Request ID。

工具获取

Linux系统中通过命令行获取Request ID

Linux系统中通过命令行获取Request ID的操作步骤如下。

  1. 获取文件URL。

    1. 登录OSS管理控制台

    2. 单击Bucket 列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择文件管理 > 文件列表

    4. 单击目标文件右侧的详情,然后单击复制文件URL

  2. 执行以下命令,获取HTTP响应头中的Request ID。

    curl -voa "[$URL]"

    [$URL]填写复制的文件URL。

    返回结果如下。requestid

通过OSS控制台上传文件时获取Request ID

以下以上传文件为例,说明如何通过开发者工具获取对应操作的Request ID。

  1. 打开开发者工具。

    1. Windows系统为例,在浏览器页面按F12键,打开开发者工具页面。

    2. 在开发者工具页面,单击Network

  2. 上传文件。

    1. OSS管理控制台,单击左侧导航栏的Bucket列表,然后单击目标Bucket名称。

    2. 单击左侧导航栏的文件管理

    3. 上传文件。具体操作,请参见上传文件

  3. 通过开发者工具获取Request ID。

    1. 在开发者工具页面,单击Name页签,选中目标文件。

    2. 单击Headers页签,在Response Headers区域,从x-oss-request-id获取对应操作的Request ID。log