クエリ文が多数のクエリおよび分析結果を返す場合、結果はより低速で表示されます。 Simple Log Serviceは、各クエリに対して返すことができるログの数を制限するためのページクエリ機能を提供します。 このトピックでは、クエリと分析結果をページ分割する方法について説明します。
ページネーションのしくみ
Simple Log Serviceは、クエリ文を実行してキーワードを使用してログを照会し、SQL構文を使用してクエリ結果を分析できるクエリおよび分析機能を提供します。 GetLogs操作を呼び出して、キーワードを使用してログの生データをクエリし、SQL構文を使用してクエリ結果を分析することもできます。 クエリステートメントには、検索ステートメントと分析ステートメントを含めることができます。 ページネーションの方法は、検索文と分析文で異なります。 詳細については、「GetLogs」をご参照ください。 ログ行の総数を取得する方法の詳細については、「GetHistograms」をご参照ください。
クエリ結果のページ分割
次の一覧では、GetLogs操作のoffsetパラメーターとlineパラメーターについて説明します。
offset: クエリ結果が読み取られる行。
line: 現在のAPIリクエストに対して返される行数。 最大100行を返すことができます。 このパラメーターを100より大きい値に設定すると、100行のみが返されます。
ページ化されたクエリが実行されると、すべてのログが読み取られるまでoffsetパラメーターの値が増加します。 値が特定の数に達すると、0が返され、進行は完了します。 この場合、必要なデータがすべて読み込まれます。
ページ分割のサンプルコード
offset = 0 # Read logs from line 0. line = 100 # Read 100 lines at a time. query = "status:200" # Query all logs in which the value of the status field is 200. while True: response = get_logstore_logs(query, offset, line) # Call the operation to read logs. process (response) # Call custom logic to process the returned result. if response.get_count() == 0 && response.is_complete() The read process is complete, and the current loop ends. else offset += 100 # The value of the offset parameter increases to 100. The next 100 lines are read.
Pythonのサンプルコード
詳細については、「Simple Log Service SDK For Pythonの概要」をご参照ください。
# The Simple Log Service endpoint. endpoint = '' # Configure environment variables. In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. accessKeyId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # The name of the project. project = '' # The name of the 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: # Display the execution result. res4.log_print()
Javaのサンプルコード
詳細については、「Simple Log Service SDK For Javaの概要」をご参照ください。
int log_offset = 0; int log_line = 100; // The number of lines that are read at a time. A maximum of 100 lines can be returned. If you want to read more than 100 lines, use the offset parameter. The offset and line parameters take effect only for a search statement that uses keywords. If you use an analytic statement, these parameters are invalid. If you want an analytic statement to return more than 100 lines, use the LIMIT clause. while (true) { GetLogsResponse res4 = null; // For each offset, 100 lines are read at a time. If the read operation fails, a maximum of three retries are allowed. 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 group by url limit 0, 500
* | select count(1) , url group by url limit 500, 500
* | select count(1) , url group by url limit 1000, 500
* | select count(1) , url group by url limit 1500, 500
ページ分割のサンプルコード
offset = 0 // Read logs from line 0. line = 500 // Read 500 lines at a time. query = "* | select count(1) , url group by url limit " while True: real_query = query + offset + "," + line response = get_logstore_logs(real_query) // Call the operation to read logs. process (response) // Call custom logic to process the returned result. if response.get_count() == 0 The read process is complete, and the current loop ends. else offset += 500 // The value of the offset parameter increases to 500. The next 500 lines are read.
Pythonのサンプルコード
詳細については、「Simple Log Service SDK For Pythonの概要」をご参照ください。
# The Simple Log Service endpoint. endpoint = '' # Configure environment variables. In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. accessKeyId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # The name of the project. project = '' # The name of the 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: # Display the execution result. 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; // For each offset, 500 lines are read at a time. If the read operation fails, a maximum of three retries are allowed. 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; } }