クエリ文が多数のクエリおよび分析結果を返す場合、結果はより低速で表示されます。 Log Serviceには、ページ化されたクエリ機能があり、クエリごとに返されるログの数を制限します。 このトピックでは、クエリおよび分析結果のページング方法について説明します。
ページング方法
Log Serviceは、クエリ文を実行してキーワードを使用してログを照会し、SQL構文を使用してクエリ結果を分析できるクエリおよび分析機能を提供します。 GetLogs操作を呼び出して、キーワードを使用してログの生データをクエリし、SQL構文を使用してクエリ結果を分析することもできます。 クエリステートメントには、検索ステートメントと分析ステートメントを含めることができます。 ページング方法は、検索文と分析文とで異なります。 詳細については、「GetLogs」をご参照ください。
クエリ結果のページング
次の一覧では、GetLogs操作のoffsetパラメーターとlineパラメーターについて説明します。
- offset: クエリ結果が返される行。
- line: 現在のAPIリクエストに対して返される行数。 最大100行を返すことができます。 このパラメーターを100より大きい値に設定すると、100行のみが返されます。
ページ化されたクエリが実行されると、すべてのログが読み取られるまでoffsetパラメーターの値が増加します。 値が特定の数に達すると、0が返され、進行は完了します。 この場合、必要なデータがすべて読み込まれます。
- ページング実装のサンプルコード
オフセット=0 // Readからログライン0。 line = 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コードの例詳細については、「Python SDK」をご参照ください。
endpoint = ''// Log Serviceエンドポイント。 詳細については、「エンドポイント」をご参照ください。 accessKeyId = ''// Alibaba CloudアカウントのAccessKey ID。 詳細については、「AccessKey ペア」をご参照ください。 Alibaba Cloudアカウントには、すべてのAPI操作を呼び出す権限があります。 Alibaba CloudアカウントのAccessKeyペアを使用すると、セキュリティリスクが発生する可能性があります。 RAMユーザーを作成して使用し、API操作を呼び出すか、ルーチンのO&Mを実行することを推奨します。 accessKey = ''// Alibaba CloudアカウントのAccessKeyシークレット。 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 = self.client.get_logs(req4) if res4 is not None and res4.is_completed(): break time.sleep(1) offset += 100 res4.is_completed() およびres4.get_count() == 0の場合: break; if res4 is not None: res4.log_print() // 実行結果を表示します。
- Javaコードの例
詳細については、「Java SDK」をご参照ください。
int log_offset = 0; int log_line = 100; // 一度に読み取られる行数。 最大100行を返すことができます。 100行を超える行を読み取る場合は、offsetパラメーターを使用します。 Theオフセットとラインパラメータを使用して検索ステートメントだけ有効キーワード。 分析ステートメントを使用する場合、これらのパラメーターは無効です。 分析ステートメントで100行を超える行を返す場合は、LIMIT句を使用します。 一方、(TRUE){ GetLogsResponse res4 = null; // オフセットごとに、一度に100行が読み取られます。 Ifをリード動作失敗した、最大の3 retriesは許可されます。 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; } }
分析結果のページング
分析結果のページングにはLIMIT句を使用できます。 例:
limit Offset, Line
次のリストは、オフセットおよびラインパラメータを示しています。
- offset: 分析結果が返される行。
- line: 現在のAPIリクエストに対して返される行数。 最大1,000,000行を返すことができます。 一度に多数のラインが読み出されると、ネットワーク遅延が増大し、クライアント側の処理速度が低下する。
たとえば、* | select count(1) , url group by url
ステートメントを使用して2,000行を返す場合は、次のステートメントを実行して、毎回4つのページクエリと500行のクエリを実行できます。
* | select count(1) 、urlグループby url limit 0, 500
* | 選択カウント (1) 、url制限500によるurlグループ、500
* | 選択カウント (1) 、url制限1000によるurlグループ、500
* | 選択カウント (1) 、url制限1500によるurlグループ、500
- ページング実装のサンプルコード
offset = 0 // 行0からログを読み取ります。 line = 500 // 一度に500の行を読み取ります。 query = "* | select count(1) , url group by url limit" while True: real_query = query + offset + "," + lines response = get_logstore_logs(real_query) // ログを読み取る操作を呼び出します。 process (response) // カスタムロジックを呼び出して、返された結果を処理します。 if response.get_count() == 0 読み取りプロセスは完了し、現在のループは終了します。 else offset += 500 // offsetパラメータの値が500に増加します。 次の500ラインが読み取られる。
- Pythonコードの例
詳細については、「Python SDK」をご参照ください。
endpoint = ''// Log Serviceエンドポイント。 詳細については、「エンドポイント」をご参照ください。 accessKeyId = ''// Alibaba CloudアカウントのAccessKey ID。 詳細については、「AccessKey ペア」をご参照ください。 Alibaba Cloudアカウントには、すべてのAPI操作を呼び出す権限があります。 Alibaba CloudアカウントのAccessKeyペアを使用すると、セキュリティリスクが発生する可能性があります。 RAMユーザーを作成して使用し、API操作を呼び出すか、ルーチンのO&Mを実行することを推奨します。 accessKey = ''// Alibaba CloudアカウントのAccessKeyシークレット。 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) res4 = self.client.get_logs(req4) if res4 is not None and res4.is_completed(): break time.sleep(1) offset += 100 res4.is_completed() およびres4.get_count() == 0の場合: break; if res4 is not None: res4.log_print() // 実行結果を表示します。
- Javaコードの例
詳細については、「Java SDK」をご参照ください。
int log_offset = 0; int log_line = 500; String origin_query = "* | select count(1) , url group by url limit" 一方、(TRUE){ GetLogsResponse res4 = null; // オフセットごとに、一度に500行が読み取られます。 Ifをリード動作失敗した、最大の3 retriesは許可されます。 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; } }