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。
以Windows系統為例,在瀏覽器頁面按
F12
鍵,開啟開發人員工具頁面。在開發人員工具頁面,單擊Network。
在開發人員工具頁面,單擊Name頁簽,選中目標檔案。
單擊Headers頁簽,在Response Headers地區,從x-oss-request-id擷取對應操作的Request ID。
通過即時日誌擷取Request ID
您可以通過OSS控制台即時查詢Bucket、Object層級的各類請求日誌,請求日誌中包含Request ID的資訊。
登入OSS管理主控台。
單擊左側導覽列的Bucket列表,然後單擊目標Bucket名稱。
選擇 。
按
Ctrl+F
鍵,搜尋request_id。
通過ossutil工具擷取Request ID
運行ossutil工具的命令時,在返回日誌中擷取Request ID。
在Linux系統中通過命令列擷取Request ID
在Linux系統中通過命令列擷取Request ID的操作步驟如下。
擷取檔案URL。
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇 。
單擊目標檔案右側的詳情,然後單擊複製檔案URL。
執行以下命令,擷取HTTP回應標頭中的Request ID。
curl -voa "[$URL]"
[$URL]填寫複製的檔案URL。
返回結果如下。
通過OSS控制台上傳檔案時擷取Request ID
以下以上傳檔案為例,說明如何通過開發人員工具擷取對應操作的Request ID。
開啟開發人員工具。
以Windows系統為例,在瀏覽器頁面按
F12
鍵,開啟開發人員工具頁面。在開發人員工具頁面,單擊Network。
上傳檔案。
在OSS管理主控台,單擊左側導覽列的Bucket列表,然後單擊目標Bucket名稱。
單擊左側導覽列的檔案管理。
上傳檔案。具體操作,請參見上傳檔案。
通過開發人員工具擷取Request ID。
在開發人員工具頁面,單擊Name頁簽,選中目標檔案。
單擊Headers頁簽,在Response Headers地區,從x-oss-request-id擷取對應操作的Request ID。