クエリ文が多数のクエリおよび分析結果を返す場合、結果の表示速度が低下します。Simple Log Service は、各クエリで返されるログの数を制限するページングクエリ機能を提供します。このトピックでは、クエリおよび分析結果のページ分割方法について説明します。
ページ分割方法の概要
GetLogs 操作を呼び出してログをクエリする場合、Simple Log Service ではクエリおよび分析結果をページ分割できます。クエリ文には、検索文と分析文を含めることができます。ページ分割方法は、検索文と分析文で異なります。 GetLogs 操作を呼び出す前に、ログの総数をクエリできます。詳細については、「GetHistograms」をご参照ください。
検索文: キーワードを使用してログの生データをクエリします。 GetLogs 操作で offset パラメーターと line パラメーターを構成して、ページングクエリを実行できます。詳細については、「ログ検索の概要」をご参照ください。
分析文: SQL 構文を使用してクエリ結果を分析します。 LIMIT 句を使用してページングクエリを実行できます。詳細については、「ログクエリと分析の概要」および「LIMIT 句」をご参照ください。
ページ分割方法別のページ分割例
次のコードは、ページ分割方法別にクエリおよび分析結果をページ分割する方法の例を示しています。ビジネス要件に基づいてページ分割方法を選択できます。
クエリ結果のページ分割の例
ページングクエリを実行すると、すべてのログが読み取られるまで、offset パラメーターの値が増加します。値が特定の数値に達すると、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 シークレットは環境変数から取得されます。 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; } }
分析結果のページ分割の例
* | select count(1) , url group by url文を使用して 1,000 行を返す場合、次の文を実行して 2 つのページングクエリを実行し、毎回 500 行をクエリできます。* | 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 シークレットは環境変数から取得されます。 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 * limit " From = int(time.time()) - 600 To = int(time.time()) log_line = 100 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 += 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 = 500; String origin_query = "* | select count(1) , url group by url limit "; while (true) { GetLogsResponse res4 = null; // 各オフセットについて、一度に 500 行が読み取られます。読み取り操作が失敗した場合、最大 3 回の再試行が許可されます。 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; } }