すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:クエリおよび分析結果をページ分割する

最終更新日:Mar 14, 2025

クエリ文が多数のクエリおよび分析結果を返す場合、結果の表示速度が低下します。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;
                  }
      }