Object Storage Service (OSS) は、user_defined_log_fields
フィールドをアクセスログに追加することで、カスタムログをサポートしています。 カスタムログフィールドを設定して、特定のリクエスト情報を監視できます。 このトピックでは、x-forwarded-for
リクエストヘッダーをログに記録し、記録された情報を中間分析に使用する方法について説明します。
前提条件
バケットに対してリアルタイムログクエリ機能が有効になっています。 詳細については、「リアルタイムログクエリ」をご参照ください。
バケットに送信されたリクエストには、アクセスログに記録するリクエストヘッダーまたはクエリパラメーターが含まれています。 詳細については、「x-oss-additional-headers」をご参照ください。
ステップ1: リクエストヘッダーの指定
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、
を選択します。リアルタイムクエリ タブで、[リクエストヘッダー] または [ログのクエリパラメーター] の横にある [追加] をクリックします。
[ログのリクエストヘッダーまたはクエリパラメーターの設定] ダイアログボックスで、[ログフィールドの指定] の横にある [追加] をクリックします。
[リクエストヘッダー] を選択し、
[x-forwarded-for]
と入力し、OK をクリックします。
ステップ2: リクエストの開始
Alibaba Cloud CDNプロキシなどのプロキシを使用してOSSにアクセスできます。
次のサンプルコードは、OSS SDK for Pythonを使用してプロキシからOSSにリクエストを送信する方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
# リソースを準備します。
bucketName = "examplebucket"
endpoint = "oss-cn-hangzhou.aliyuncs.com"
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットインスタンスを初期化します。
bucket = oss2.Bucket(auth、endpoint、bucketName)
# プロキシを使用してリクエストをシミュレートします。
headers = dict()
ヘッダー ["x-forwarded-for"] = "10.0.0.1"
result = bucket.put_object ('exampleobject.txt '、'Hello OSS' 、ヘッダー)
# HTTPステータスコードを表示します。
print('http status: {0}'.format(result.status))
# リクエストIDを表示します。 リクエストIDは、リクエストを一意に識別します。 このパラメーターをログに追加することを推奨します。
print('request_id: {0}'.format(result.request_id))
ステップ3: ログのフィルタリング
リアルタイムクエリ タブで、次のクエリステートメントを入力し、[検索と分析] をクリックします。
* とbucket: examplebucketと操作: PutObject | select request_id, json_format(json_extract(from_utf8(from_base64(user_defined_log_fields))) 、myheaderとしての '$.headers["x-forwarded-for"]')
10.0.0.2プロキシIPアドレスからのリクエストをフィルタリングします。
次のクエリステートメントを入力し、[検索と分析] をクリックします。
)* とbucket: examplebucketと操作: PutObject | select request_id, json_format(json_extract(from_utf8(from_base64(user_defined_log_fields))) 、'% 10.0.0.2%' のようなmyheaderを持つmyheaderとしての '$.headers["x-forwarded-for"]'
FAQ
user_defined_log_fields
がインデックス付きフィールドではないのはなぜですか。
リアルタイムログクエリ機能が追加された後、user_defined_log_fields
フィールドが追加されます。 フィールドをインデックス化するには、フィールドインデックスを手動で更新する必要があります。 詳細については、「フィールドインデックスのリセット」をご参照ください。 フィールドをインデックスフィールドにしたくない場合は、操作を実行する必要はありません。
Simple Log Serviceが、デコードに少なくとも2バイトが必要であるというBase64デコードエラーを返した場合はどうすればよいですか?
ログ分析の開始時刻は、カスタムログ設定の有効時刻より前である必要があります。 カスタムログ設定が有効になる前は、user_defined_log_fields
フィールドの値は-
であり、Base64-encodedされていません。 たとえば、このフィールドの値は、HTTPステータスコードが499されたリクエストの場合も-
です。 この場合、ログデータを分析する前に、user_defined_log_fieldsフィールドの値が-
であるログを除外することを推奨します。