全部產品
Search
文件中心

Object Storage Service:日誌轉存

更新時間:Jun 19, 2024

訪問OSS的過程中會產生大量的訪問日誌。您可以通過日誌轉存功能將這些日誌按照固定命名規則,以小時為單位組建記錄檔檔案寫入您指定的儲存空間(Bucket)。對於已儲存的日誌,您可以通過阿里雲Log Service或搭建Spark叢集等方式進行分析。

注意事項

  • 如果組建記錄檔的源Bucket有地區屬性,則儲存日誌的目標Bucket與源Bucket可以相同也可以不同,但是必須屬於同一帳號下的相同地區。

  • 記錄檔預計會在48小時內產生。某個時段的記錄檔可能不會記錄該時段的所有請求,部分請求可能會出現在上一時段或下一時段的記錄檔中。因此,某個時段的記錄檔不能確保該時段日誌記錄的完整性和即時性。

  • 在您關閉日誌轉存功能前,OSS的記錄檔會每隔1小時產生一次。請及時清理不再需要的記錄檔,以減少您的儲存費用。

    您可以通過生命週期規則定期刪除記錄檔。更多資訊,請參見基於最後一次修改時間的生命週期規則

  • 為避免影響OSS-HDFS服務的正常使用或者引發資料汙染的風險,在開通了OSS-HDFS服務的Bucket中設定日誌轉存規則時,禁止將日誌首碼填寫為.dlsdata/

  • OSS會根據需求在日誌的尾部添加一些欄位,請您在開發Tlog工具時考慮相容性的問題。

記錄檔命名規則

轉存後的記錄檔命名規則如下:

<TargetPrefix><SourceBucket>YYYY-mm-DD-HH-MM-SS-UniqueString

欄位

說明

TargetPrefix

記錄檔的檔案名稱首碼。

SourceBucket

產生訪問日誌的源Bucket名稱。

YYYY-mm-DD-HH-MM-SS

記錄檔被建立的時間。從左至右分別表示:年、月、日、小時、分鐘和秒。

UniqueString

系統產生的字串,是記錄檔的唯一標識。

日誌的格式和樣本

  • 日誌格式

    OSS的訪問日誌包含要求者和被訪問資源的相關資訊,格式如下:

    RemoteIP Reserved Reserved Time "RequestURL" HTTPStatus SentBytes RequestTime "Referer" "UserAgent" "HostName" "RequestID" "LoggingFlag" "RequesterAliyunID" "Operation" "BucketName" "ObjectName" ObjectSize ServerCostTime "ErrorCode" RequestLength "UserID" DeltaDataSize "SyncRequest" "StorageClass" "TargetStorageClass" "TransmissionAccelerationAccessPoint" "AccessKeyID"

    欄位

    樣本值

    說明

    RemoteIP

    192.168.0.1

    要求者的IP地址。

    Reserved

    -

    保留欄位,固定值為-

    Reserved

    -

    保留欄位,固定值為-

    Time

    03/Jan/2021:14:59:49 +0800

    OSS收到請求的時間。

    RequestURL

    GET /example.jpg HTTP/1.0

    包含query string的請求URL。

    OSS會忽略以x-開頭的query string參數,但這個參數會被記錄在訪問日誌中。所以您可以使用x-開頭query string參數標記一個請求,然後使用這個標記快速尋找該請求對應的日誌。

    HTTPStatus

    200

    OSS返回的HTTP狀態代碼。

    SentBytes

    999131

    請求產生的下行流量。單位:Byte。

    RequestTime

    127

    完成本次請求耗費的時間。單位:ms。

    Referer

    http://www.aliyun.com/product/oss

    請求的HTTP Referer。

    UserAgent

    curl/7.15.5

    HTTP的User-Agent頭。

    HostName

    examplebucket.oss-cn-hangzhou.aliyuncs.com

    請求訪問的目標網域名稱。

    RequestID

    5FF16B65F05BC932307A3C3C

    請求的Request ID。

    LoggingFlag

    true

    是否已開啟日誌轉存。取值如下:

    • true表示已開啟日誌轉存。

    • false表示未開啟日誌轉存。

    RequesterAliyunID

    16571836914537****

    要求者的使用者ID。取值-表示匿名訪問。

    Operation

    GetObject

    請求類型。

    BucketName

    examplebucket

    請求的目標Bucket名稱。

    ObjectName

    example.jpg

    請求的目標Object名稱。

    ObjectSize

    999131

    目標Object大小。單位:Byte。

    ServerCostTime

    88

    OSS處理本次請求所花的時間。單位:毫秒。

    ErrorCode

    -

    OSS返回的錯誤碼。取值-表示未返回錯誤碼。

    RequestLength

    302

    請求的長度。單位:Byte。

    UserID

    16571836914537****

    Bucket擁有者ID。

    DeltaDataSize

    -

    Object大小的變化量。取值-表示此次請求不涉及Object的寫入操作。

    SyncRequest

    cdn

    請求是否為CDN回源請求。取值如下:

    • cdn表示請求是CDN回源請求。

    • -表示請求不是CDN回源請求。

    StorageClass

    Standard

    目標Object的儲存類型。取值如下:

    • Standard:標準儲存。

    • IA:低頻訪問儲存。

    • Archive:Archive Storage。

    • Cold Archive:冷Archive Storage。

    • DeepCold Archive:深度冷Archive Storage。

    • -:未擷取到Object儲存類型。

    TargetStorageClass

    -

    是否通過生命週期規則或CopyObject轉換了Object的儲存類型。取值如下:

    • Standard:轉換為標準儲存。

    • IA:轉換為低頻訪問儲存。

    • Archive:轉換為Archive Storage。

    • Cold Archive:轉換為冷Archive Storage。

    • DeepCold Archive:轉換為深度冷Archive Storage。

    • -:不涉及Object儲存類型轉換操作。

    TransmissionAccelerationAccessPoint

    -

    通過傳輸加速網域名稱訪問目標Bucket時使用的傳輸加速存取點。例如要求者通過華東1(杭州)的存取點訪問目標Bucket時,值為cn-hangzhou

    取值-表示未使用傳輸加速網域名稱或傳輸加速存取點與目標Bucket所在地區相同。

    AccessKeyID

    LTAI4FrfJPUSoKm4JHb5****

    要求者的AccessKey ID。

    • 通過控制台的方式發起請求時,日誌欄位中會顯示為以TMP開頭的臨時AccessKey ID。

    • 通過工具、SDK以長期密鑰的方式發起請求時,日誌欄位中顯示為常見的AccessKey ID,樣本值為LTAI4FrfJPUSoKm4JHb5****

    • 通過STS臨時訪問憑證發起請求時,顯示為以STS開頭的臨時AccessKey ID。

    說明

    AccessKey ID欄位顯示為-,表示匿名請求。

  • 日誌樣本

    192.168.0.1 - - [03/Jan/2021:14:59:49 +0800] "GET /example.jpg HTTP/1.0" 200 999131 127 "http://www.aliyun.com/product/oss" "curl/7.15.5" "examplebucket.oss-cn-hangzhou.aliyuncs.com" "5FF16B65F05BC932307A3C3C" "true" "16571836914537****" "GetObject" "examplebucket" "example.jpg" 999131 88 "-" 302 "16571836914537****" - "cdn" "standard" "-" "-" "LTAI4FrfJPUSoKm4JHb5****"

    記錄檔轉存到OSS指定Bucket後,您可以通過Log Service對記錄檔進行分析。對記錄檔進行分析前,您需要通過資料匯入方式將OSS記錄檔匯入到Log Service。有關資料匯入的具體操作,請參見匯入OSS資料。有關Log Service分析功能的更多資訊,請參見分析概述

操作步驟

使用OSS控制台

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇日誌管理 > 日誌轉存

  4. 日誌轉存頁面,開啟日誌儲存,並設定日誌儲存位置及日誌首碼。

    • 日誌儲存位置:下拉選擇儲存日誌記錄的Bucket名稱,只能選擇同一帳號下相同地區的Bucket。

    • 日誌首碼:記錄檔儲存的目錄。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。例如,日誌首碼指定為log/,則記錄檔將被記錄在log/目錄下。

  5. 單擊儲存

使用阿里雲SDK

以下僅列舉常見SDK的設定日誌轉存的程式碼範例。關於其他SDK的設定日誌轉存的程式碼範例,請參見SDK簡介

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.SetBucketLoggingRequest;

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";
        // 填寫存放記錄檔的目標Bucket。targetBucketName與bucketName可以為相同或不同的Bucket。
        String targetBucketName = "yourTargetBucketName";
        // 設定記錄檔儲存的目錄為log/。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。
        String targetPrefix = "log/";

        // 建立OSSClient執行個體。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            SetBucketLoggingRequest request = new SetBucketLoggingRequest(bucketName);
            request.setTargetBucket(targetBucketName);
            request.setTargetPrefix(targetPrefix);
            ossClient.setBucketLogging(request);
        } 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\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫待開啟日誌轉存功能的Bucket名稱,例如examplebucket。
$bucket= "examplebucket";

$option = array();
// 設定存放記錄檔的目標Bucket。
$targetBucket = "destbucket";
// 設定記錄檔儲存的目錄。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。
$targetPrefix = "log/";

try {
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

    // 開啟日誌轉存。
    $ossClient->putBucketLogging($bucket, $targetBucket, $targetPrefix, $option);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": OK" . "\n");            
const OSS = require('ali-oss')
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,
  // yourbucketname填寫儲存空間名稱。
  bucket: 'yourbucketname'
});
async function putBucketLogging () {
  try {
     const result = await client.putBucketLogging('bucket-name', 'logs/');
     console.log(result)
  } catch (e) {
    console.log(e)
  }
}
putBucketLogging();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketLogging

# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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')

# 將記錄檔儲存在當前Bucket。
# 設定記錄檔儲存的目錄為log/。如果指定此項,則記錄檔將儲存在Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在Bucket的根目錄下。
# 開啟日誌轉存功能。
logging = bucket.put_bucket_logging(BucketLogging(bucket.bucket_name, 'log/'))
if logging.status == 200:
    print("Enable access logging")
else:
    print("request_id :", logging.request_id)
    print("resp : ", logging.resp.response)            
using Aliyun.OSS;
using Aliyun.OSS.Common;

// 填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫待開啟日誌轉存功能的Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫存放記錄檔的目標Bucket。targetBucketName與bucketName可以為相同或不同的Bucket。
var targetBucketName = "destbucket";
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // 設定記錄檔儲存的目錄為log/。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。
    var request = new SetBucketLoggingRequest(bucketName, targetBucketName, "log/");
    // 開啟日誌轉存功能。
    client.SetBucketLogging(request);
    Console.WriteLine("Set bucket:{0} Logging succeeded ", bucketName);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error info: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
PutBucketLoggingRequest request = new PutBucketLoggingRequest();
// 指定要開啟訪問日誌記錄的源Bucket。
request.setBucketName("yourSourceBucketName");
// 指定儲存訪問日誌的目標Bucket。
// 目標Bucket和源Bucket必須屬於同一地區。源Bucket和目標Bucket可以是同一個Bucket,也可以是不同的Bucket。
request.setTargetBucketName("yourTargetBucketName");
// 設定記錄檔存放的目錄。
request.setTargetPrefix("<yourTargetPrefix>");

OSSAsyncTask task = oss.asyncPutBucketLogging(request, new OSSCompletedCallback<PutBucketLoggingRequest, PutBucketLoggingResult>() {
    @Override
    public void onSuccess(PutBucketLoggingRequest request, PutBucketLoggingResult result) {
        OSSLog.logInfo("code::"+result.getStatusCode());
    }

    @Override
    public void onFailure(PutBucketLoggingRequest request, ClientException clientException, ServiceException serviceException) {
         OSSLog.logError("error: "+serviceException.getRawMessage());
    }
});
task.waitUntilFinished();
package main

import (
    "fmt"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

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請按實際情況填寫。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider)) 
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // 填寫待開啟日誌轉存功能的Bucket名稱,例如examplebucket。
    bucketName := "examplebucket"
    // 填寫存放記錄檔的目標Bucket。targetBucketName與bucketName必須處於相同地區,可以是相同或不同的Bucket。
    targetBucketName := "destbucket"
    // 設定記錄檔儲存的目錄為log/。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。
    targetPrefix := "log/"

    // 開啟日誌轉存功能。
    err = client.SetBucketLogging(bucketName, targetBucketName, targetPrefix, true)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
}            
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS帳號資訊。*/
            
    /* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫待開啟日誌轉存功能的Bucket名稱,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填寫存放記錄檔的目標Bucket。targetBucketName與bucketName可以為相同或不同的Bucket。*/
    std::string TargetBucketName = "destbucket";
    /* 設定記錄檔儲存的目錄為log/。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。*/
    std::string TargetPrefix  ="log/";

    /* 初始化網路等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);  

    /* 開啟日誌轉存功能。*/
    SetBucketLoggingRequest request(BucketName, TargetBucketName, TargetPrefix);
    auto outcome = client.SetBucketLogging(request);

    if (!outcome.isSuccess()) {
        /* 異常處理。*/
        std::cout << "SetBucketLogging fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 釋放網路等資源。*/
    ShutdownSdk();
    return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫存放記錄檔的目標Bucket。targetBucketName與bucketName可以為相同或不同的Bucket。*/
const char *target_bucket_name = "yourTargetBucketName";
/* 設定記錄檔儲存的目錄。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。*/
const char *target_logging_prefix = "yourTargetPrefix";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*類型的字串初始化aos_string_t類型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    /* 是否使用了CNAME。0表示不使用。*/
    options->config->is_cname = 0;
    /* 用於設定網路相關參數,比如逾時時間等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程式入口調用aos_http_io_initialize方法來初始化網路、記憶體等全域資源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用於記憶體管理的記憶體池(pool), 等價於apr_pool_t。其實現代碼在apr庫中。*/
    aos_pool_t *pool;
    /* 重新建立一個記憶體池,第二個參數是NULL,表示沒有繼承其它記憶體池。*/
    aos_pool_create(&pool, NULL);
    /* 建立並初始化options,該參數包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全域配置資訊。*/
    oss_request_options_t *oss_client_options;
    /* 在記憶體池中分配記憶體給options。*/
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的選項oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化參數 */
    aos_string_t bucket;
    oss_logging_config_content_t *content;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_str_set(&bucket, bucket_name);
    content = oss_create_logging_rule_content(pool);
    aos_str_set(&content->target_bucket, target_bucket_name);
    aos_str_set(&content->prefix, target_logging_prefix);
    /* 開啟儲存空間的訪問日誌記錄。*/
    resp_status = oss_put_bucket_logging(oss_client_options, &bucket, content, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("put bucket logging succeeded\n");
    } else {
        printf("put bucket logging failed, code:%d, error_code:%s, error_msg:%s, request_id:%s\n",
            resp_status->code, resp_status->error_code, resp_status->error_msg, resp_status->req_id); 
    }
    /* 釋放記憶體池,相當於釋放了請求過程中各資源分派的記憶體。*/
    aos_pool_destroy(pool);
    /* 釋放之前分配的全域資源。*/
    aos_http_io_deinitialize();
    return 0;
}
require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  # Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)

# 填寫Bucket名稱,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# logging_bucket填寫存放記錄檔的目標Bucket。
# my-log填寫記錄檔儲存的目錄,如果指定此項,則記錄檔將儲存在指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。
bucket.logging = Aliyun::OSS::BucketLogging.new(
  enable: true, target_bucket: 'logging_bucket', target_prefix: 'my-log')

使用命令列工具ossutil

關於使用ossutil設定日誌轉存的具體操作, 請參見開啟日誌轉存

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketLogging

常見問題

中斷的請求能否在OSS訪問日誌中查詢?

OSS訪問日誌目前不會記錄中斷的請求。如果您是通過SDK發起的請求,可以根據SDK的傳回值判斷請求中斷的原因。