對象存儲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。
以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。