クエリ結果が大量にある場合、ページネーションを使用して、リクエストごとに返されるログ数を制御します。検索文では offset パラメーターと line パラメーターを、分析文では LIMIT 句を使用してページネーションを行います。
ページネーションの方法
GetLogs 操作は、検索ステートメントと分析ステートメントの両方でページネーションをサポートしており、それぞれ異なる方式を使用します。 クエリを実行する前に合計ログ数を取得するには、GetHistograms を呼び出します。
-
検索文:キーワードで生ログデータをクエリします。ページネーションを行うには、GetLogs API で offset パラメーターと line パラメーターを設定します。ログ検索の概要
-
分析文:SQL でクエリ結果を分析します。LIMIT 句を使用してページネーションを行います。ログのクエリと分析の概要 | LIMIT 句
ページネーションの例
次の例では、クエリ結果と分析結果のページネーションを行う方法を示します。
-
クエリ結果のページネーション
ページングクエリでは、GetLogs が 0 件の結果を返し、クエリが完了したとマークされるまで、リクエストごとにオフセットが増加します。
-
ページネーションの疑似コード
offset = 0 # システムがログの読み取りを開始する行。値 0 は、システムが 0 行目からログを読み取ることを示します。 line = 100 # 現在の API リクエストで返される行数。最大 100 行を返すことができます。このパラメーターに 100 より大きい値を設定した場合でも、100 行しか返されません。一度に 100 行を読み取ります。 query = "status:200" # status フィールドの値が 200 であるすべてのログをクエリします。 while True: response = get_logstore_logs(query, offset, line) # 操作を呼び出してログを読み取ります。 process (response) # カスタムロジックを呼び出して、返された結果を処理します。 if response.get_count() == 0 && response.is_complete() # 読み取りプロセスは完了し、現在のループは終了します。 else offset += 100 # offset パラメーターの値を 100 増加させます。次の 100 行が読み取られます。Python コードの例
Simple Log Service SDK for Python の概要
# Simple Log Service のエンドポイント。 endpoint = '' # この例では、AccessKey ID と AccessKey secret は環境変数から取得されます。 accessKeyId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # プロジェクトの名前。 project = '' # Logstore の名前。 logstore = '' client = LogClient(endpoint, accessKeyId, accessKey) topic = "" From = int(time.time()) - 600 To = int(time.time()) log_line = 100 offset = 0 while True: res4 = None for retry_time in range(0, 3): req4 = GetLogsRequest(project, logstore, From, To, topic=topic, line=log_line, offset=offset) res4 = client.get_logs(req4) if res4 is not None and res4.is_completed(): break time.sleep(1) offset += 100 if res4.is_completed() and res4.get_count() == 0: break; if res4 is not None: # 実行結果。 res4.log_print()Java コードの例
Simple Log Service SDK for Java の概要
int log_offset = 0; int log_line = 100; // 一度に読み取る行数。最大 100 行を返すことができます。100 行を超える行を読み取る場合は、offset パラメーターを使用します。offset パラメーターと line パラメーターは、キーワードを使用する検索文に対してのみ有効です。分析文を使用する場合、offset パラメーターと line パラメーターは無効です。分析文で 100 行を超える行を返す場合は、LIMIT 句を使用します。 while (true) { GetLogsResponse res4 = null; // オフセットごとに、一度に 100 行が読み取られます。読み取り操作が失敗した場合、最大 3 回のリトライが許可されます。 for (int retry_time = 0; retry_time < 3; retry_time++) { GetLogsRequest req4 = new GetLogsRequest(project, logstore, from, to, topic, query, log_offset, log_line, false); res4 = client.GetLogs(req4); if (res4 != null && res4.IsCompleted()) { break; } Thread.sleep(200); } System.out.println("Read log count:" + String.valueOf(res4.GetCount())); log_offset += log_line; if (res4.IsCompleted() && res4.GetCount() == 0) { break; } }
-
-
分析結果のページネーション
SQL の LIMIT 句を使用して、分析結果をページ分割します。 たとえば、
* | select count(1) , url group by urlが 1,000 エントリを返す場合、500 エントリずつ 2 つのリクエストに分割します:* | select count(1) , url group by url limit 0, 500 * | select count(1) , url group by url limit 500, 500-
ページネーションの疑似コード
offset = 0 // システムがログの読み取りを開始する行。値 0 は、システムが 0 行目からログを読み取ることを示します。 line = 500 // 現在の API リクエストで返される行数。最大 1,000,000 行を返すことができます。一度に多くの行を読み取ると、ネットワーク遅延が増加し、クライアント側の処理速度が低下します。一度に 500 行を読み取ります。 query = "* | select count(1) , url group by url limit " while True: real_query = query + offset + "," + line response = get_logstore_logs(real_query) // 操作を呼び出してログを読み取ります。 process (response) // カスタムロジックを呼び出して、返された結果を処理します。 if response.get_count() == 0 // 読み取りプロセスは完了し、現在のループは終了します。 else offset += 500 // offset パラメーターの値を 500 増加させます。次の 500 行が読み取られます。Python コードの例
Simple Log Service SDK for Python の概要
# Simple Log Service のエンドポイント。 endpoint = '' # この例では、AccessKey ID と AccessKey secret は環境変数から取得されます。 accessKeyId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # プロジェクトの名前。 project = '' # Logstore の名前。 logstore = '' client = LogClient(endpoint, accessKeyId, accessKey) topic = "" origin_query = "* | select count(1) , url group by url limit " From = int(time.time()) - 600 To = int(time.time()) log_line = 500 offset = 0 while True: res4 = None query = origin_query + str(offset) + "," + str(log_line) for retry_time in range(0, 3): req4 = GetLogsRequest(project, logstore, From, To, topic=topic, query=query) res4 = client.get_logs(req4) if res4 is not None and res4.is_completed(): break time.sleep(1) offset += log_line if res4.is_completed() and res4.get_count() == 0: break; if res4 is not None: # 実行結果。 res4.log_print()Java コードの例
Simple Log Service SDK for Java の概要
int log_offset = 0; int log_line = 500; String origin_query = "* | select count(1) , url group by url limit "; while (true) { GetLogsResponse res4 = null; // オフセットごとに、一度に 500 行が読み取られます。読み取り操作が失敗した場合、最大 3 回のリトライが許可されます。 String query = origin_query + log_offset + "," + log_line; for (int retry_time = 0; retry_time < 3; retry_time++) { GetLogsRequest req4 = new GetLogsRequest(project, logstore, from, to, topic, query); res4 = client.GetLogs(req4); if (res4 != null && res4.IsCompleted()) { break; } Thread.sleep(200); } System.out.println("Read log count:" + String.valueOf(res4.GetCount())); log_offset += log_line; if (res4.GetCount() == 0) { break; } }
-