全部產品
Search
文件中心

Object Storage Service:擷取Request ID

更新時間:Feb 28, 2024

Object Storage Service為接收到的每個請求分配唯一的伺服器請求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