訪問OSS的過程中會產生大量的訪問日誌。您可以通過日誌轉存功能將這些日誌按照固定命名規則,以小時為單位組建記錄檔檔案寫入您指定的儲存空間(Bucket)。對於已儲存的日誌,您可以通過阿里雲Log Service或搭建Spark叢集等方式進行分析。
注意事項
如果組建記錄檔的源Bucket有地區屬性,則儲存日誌的目標Bucket與源Bucket可以相同也可以不同,但是必須屬於同一帳號下的相同地區。
為源Bucket配置日誌轉存時,日誌推送操作本身也會產生新的日誌。如果源Bucket和目標Bucket是同一個,這些新產生的日誌還會被日誌功能再次記錄並推送,導致日誌不斷迴圈產生。建議將日誌轉存的源Bucket和儲存日誌的目標Bucket配置為不同的Bucket。
記錄檔預計會在48小時內產生。某個時段的記錄檔可能不會記錄該時段的所有請求,部分請求可能會出現在上一時段或下一時段的記錄檔中。因此,某個時段的記錄檔不能確保該時段日誌記錄的完整性和即時性。
在您關閉日誌轉存功能前,OSS的記錄檔會每隔1小時產生一次。請及時清理不再需要的記錄檔,以減少您的儲存費用。
您可以通過生命週期規則定期刪除記錄檔。更多資訊,請參見基於最後一次修改時間的生命週期規則。
為避免影響OSS-HDFS服務的正常使用或者引發資料汙染的風險,在開通了OSS-HDFS服務的Bucket中設定日誌轉存規則時,禁止將日誌首碼填寫為
.dlsdata/。OSS會根據需求在日誌的尾部添加一些欄位,請您在開發Tlog工具時考慮相容性的問題。從 2025 年 9 月 17 日起,日誌內容新增 Bucket ARN 欄位。
配置日誌轉存
為Bucket配置日誌轉存
控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇。
在日誌轉存頁面,開啟日誌儲存,按以下說明完成各配置項。
配置項
說明
日誌儲存位置
預設儲存在當前Bucket。如果您希望儲存至其他Bucket,需要下拉選擇儲存日誌記錄的Bucket名稱,只能選擇同一帳號下相同地區的Bucket。
日誌首碼
記錄檔儲存的目錄。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。例如,日誌首碼指定為log/,則記錄檔將被記錄在log/目錄下。
授權角色
授權OSS通過扮演預設角色或者自訂角色完成日誌轉存操作。
預設日誌轉存授權(建議使用)
選擇預設日誌轉存授權後,會自動產生預設角色
AliyunOSSLoggingDefaultRole,並完成角色授權。該角色支援本帳號下所有Bucket日誌轉存的授權。首次使用日誌轉存功能時,需要單擊一鍵授權自動完成預設角色建立和授權操作。自訂授權
如果您只需要授權對指定Bucket完成日誌轉存,可以使用自訂角色授權的方式。使用自訂授權時,您需要完成以下步驟。
建立普通服務角色。建立角色過程中,信任主體類型選擇雲端服務,信任主體名稱選擇Object Storage Service。
使用KMS加密方式的Bucket
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:List*", "kms:Describe*", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "oss:PutObject", "oss:AbortMultipartUpload" ], "Resource": "acs:oss:*:*:examplebucket/*" } ] }未使用KMS加密方式的Bucket
未使用KMS加密方式包括兩種,即Bucket未開啟服務端加密或者使用了OSS完全託管的加密方式。以上兩種情況需按以下樣本配置自訂權限原則。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject", "oss:AbortMultipartUpload" ], "Resource": "acs:oss:*:*:examplebucket/*" } ] }
單擊儲存。
ossutil
您可以使用命令列工具ossutil來開啟日誌轉存功能,ossutil的安裝請參見安裝ossutil。
以下命令用於為儲存空間examplebucket開啟日誌轉存功能,記錄檔首碼為MyLog-,儲存訪問日誌的Bucket為dest-bucket。
ossutil api put-bucket-logging --bucket examplebucket --bucket-logging-status "{\"LoggingEnabled\":{\"TargetBucket\":\"destBucket\",\"TargetPrefix\":\"MyLog-\"}}"關於該命令的更多資訊,請參見put-bucket-logging。
SDK
以下僅列舉常見SDK的設定日誌轉存的程式碼範例。關於其他SDK的設定日誌轉存的程式碼範例,請參見SDK簡介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
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/";
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
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,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$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,
authorizationV4: true,
// 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.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# examplebucket填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 將記錄檔儲存在當前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";
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();
// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
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請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
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";
/* yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫待開啟日誌轉存功能的Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫存放記錄檔的目標Bucket。targetBucketName與bucketName可以為相同或不同的Bucket。*/
std::string TargetBucketName = "destbucket";
/* 設定記錄檔儲存的目錄為log/。如果指定此項,則記錄檔將儲存在目標Bucket的指定目錄下。如果不指定此項,則記錄檔將儲存在目標Bucket的根目錄下。*/
std::string TargetPrefix ="log/";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 開啟日誌轉存功能。*/
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";
/* yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
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"));
//需要額外配置以下兩個參數
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用了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')API
調用PutBucketLogging介面為Bucket開啟日誌轉存功能。
為向量Bucket配置日誌轉存
控制台
在向量Bucket頁面,單擊目標Bucket,在左側導覽列選擇 日誌管理 > 日誌轉存。
開啟 日誌轉存 開關,並配置以下參數:
目標儲存位置:選擇用於存放記錄檔的Bucket(必須與向量Bucket在同一地區)。
日誌首碼:設定記錄檔的目錄和首碼,如
MyLog-。授權角色:使用預設的Log Service角色AliyunOSSLoggingDefaultRole或選擇一個自訂角色。
ossutil
以下樣本展示了如何為名為examplebucket的儲存空間開啟日誌轉存功能,記錄檔首碼為MyLog-,儲存訪問日誌的Bucket為examplebucket。
使用JSON設定檔,bucket-logging-status.json內容如下:
{ "BucketLoggingStatus": { "LoggingEnabled": { "TargetBucket": "examplebucket", "TargetPrefix": "MyLog-", "LoggingRole": "AliyunOSSLoggingDefaultRole" } } }命令樣本如下:
ossutil vectors-api put-bucket-logging --bucket examplebucket --bucket-logging-status file://bucket-logging-status.json使用JSON配置參數,命令樣本如下:
ossutil vectors-api put-bucket-logging --bucket examplebucket --bucket-logging-status "{\"BucketLoggingStatus\":{\"LoggingEnabled\":{\"TargetBucket\":\"examplebucket\",\"TargetPrefix\":\"MyLog-\",\"LoggingRole\":\"AliyunOSSLoggingDefaultRole\"}}}"
SDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.vectors as oss_vectors
parser = argparse.ArgumentParser(description="vector put bucket logging sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--account_id', help='The account id.', required=True)
parser.add_argument('--target_bucket', help='The name of the target bucket.', required=True)
def main():
args = parser.parse_args()
# Loading credentials values from the environment variables
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Using the SDK's default configuration
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
cfg.account_id = args.account_id
if args.endpoint is not None:
cfg.endpoint = args.endpoint
vector_client = oss_vectors.Client(cfg)
result = vector_client.put_bucket_logging(oss_vectors.models.PutBucketLoggingRequest(
bucket=args.bucket,
bucket_logging_status=oss_vectors.models.BucketLoggingStatus(
logging_enabled=oss_vectors.models.LoggingEnabled(
target_bucket=args.target_bucket,
target_prefix='log-prefix',
logging_role='AliyunOSSLoggingDefaultRole'
)
)
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
if __name__ == "__main__":
main()
Go
package main
import (
"context"
"flag"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/vectors"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
accountId string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the vector bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the vector bucket.")
flag.StringVar(&accountId, "account-id", "", "The id of vector account.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(accountId) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, accounId required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).WithAccountId(accountId)
client := vectors.NewVectorsClient(cfg)
request := &vectors.PutBucketLoggingRequest{
Bucket: oss.Ptr(bucketName),
BucketLoggingStatus: &vectors.BucketLoggingStatus{
&vectors.LoggingEnabled{
TargetBucket: oss.Ptr("TargetBucket"),
TargetPrefix: oss.Ptr("TargetPrefix"),
LoggingRole: oss.Ptr("AliyunOSSLoggingDefaultRole"),
},
},
}
result, err := client.PutBucketLogging(context.TODO(), request)
if err != nil {
log.Fatalf("failed to put vector bucket logging %v", err)
}
log.Printf("put vector bucket logging result:%#v\n", result)
}
API
調用PutBucketLogging介面為向量Bucket開啟日誌轉存功能。
記錄檔命名規則
轉存後的記錄檔命名規則如下:
<TargetPrefix><SourceBucket>YYYY-mm-DD-HH-MM-SS-UniqueString欄位 | 說明 |
TargetPrefix | 記錄檔的檔案名稱首碼。 |
SourceBucket | 產生訪問日誌的源Bucket名稱。 |
YYYY-mm-DD-HH-MM-SS | 日誌的時間分區。從左至右分別表示:年、月、日、小時、分鐘和秒。當前轉存的日誌是以小時粒度存放,例如:HH 為 01 時,代表為 01 點 00 分 00 秒 - 01 點 59 分 59 秒之間的日誌資訊,同時 MM、SS 均會推送 00。 |
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" "BucketARN"欄位
樣本值
說明
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回源請求。
lifecycle:通過生命週期規則轉儲或者刪除資料的請求。
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
LTAI****************
要求者的AccessKey ID。
通過控制台的方式發起請求時,日誌欄位中會顯示為以TMP開頭的臨時AccessKey ID。
通過工具、SDK以長期密鑰的方式發起請求時,日誌欄位中顯示為常見的AccessKey ID,樣本值為
LTAI****************。通過STS臨時訪問憑證發起請求時,顯示為以STS開頭的臨時AccessKey ID。
說明AccessKey ID欄位顯示為-,表示匿名請求。
BucketArn
acs:oss***************
Bucket的全域唯一資源描述符。
日誌樣本
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" "-" "-" "LTAI****************" "acs:oss***************"記錄檔轉存到OSS指定Bucket後,您可以通過Log Service對記錄檔進行分析。對記錄檔進行分析前,您需要通過資料匯入方式將OSS記錄檔匯入到Log Service。有關資料匯入的具體操作,請參見匯入OSS資料。有關Log Service分析功能的更多資訊,請參見查詢與分析概述。