All Products
Search
Document Center

Simple Log Service:Paginate query and analysis results

Last Updated:Mar 13, 2025

If a query statement returns a large number of query and analysis results, the results are displayed at a lower speed. Simple Log Service provides the paged query feature to limit the number of logs that can be returned for each query. This topic describes the pagination methods for query and analysis results.

Pagination method overview

When you call the GetLogs operation to query logs, Simple Log Service allows you to paginate the query and analysis results. A query statement can contain a search statement and an analytic statement. The pagination methods vary between the search statement and the analytic statement. You can query the total number of logs before you call the GetLogs operation. For more information, see GetHistograms.

  • Search statement: queries the raw data of logs by using keywords. You can configure the offset and line parameters in the GetLogs operation to perform a paged query. For more information, see Log search overview.

  • Analytic statement: analyzes query results by using the SQL syntax. You can use the LIMIT clause to perform a paged query. For more information, see Overview of log query and analysis and LIMIT clause.

Pagination examples by pagination method

The following code provides examples on how to paginate query and analysis results by pagination method. You can select a pagination method based on your business requirements.

  • Examples of paginating query results

    When you perform a paged query, the value of the offset parameter increases until all logs are read. When the value reaches a specific number, 0 is returned, and the progress is complete. In this case, all the required data is read.

    • Sample code for pagination implementation

      offset = 0                           # The line from which the system starts to read logs. The value 0 indicates that the system reads logs from line 0. 
      line = 100                          # The number of rows that are returned for the current API request. Up to 100 rows can be returned. If you set this parameter to a value greater than 100, only 100 rows are returned. 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 code example

      For more information, see Overview of Simple Log Service SDK for Python.

      # The Simple Log Service endpoint. 
      endpoint = '' 
      # 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:
               # The execution result. 
              res4.log_print() 

      Java code example

      For more information, see Overview of Simple Log Service SDK for Java.

      int log_offset = 0;
      int log_line = 100;   // The number of lines that are read at a time. Up to 100 rows 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, the offset and line parameters are invalid. If you want an analytic statement to return more than 100 rows, use the LIMIT clause. 
      while (true) {
          GetLogsResponse res4 = null;
          // For each offset, 100 lines are read at a time. If the read operation fails, up to 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;
                  }
       }                    
  • Examples of paginating analysis results

    You can use the LIMIT clause to paginate analysis results. For example, if you want to use the * | select count(1) , url group by url statement to return 1,000 lines, you can execute the following statements to perform 2 paged queries and query 500 lines each time:

    * | select count(1) , url  group by url  limit 0, 500
    * | select count(1) , url  group by url  limit 500, 500
    • Sample code for pagination implementation

      offset = 0     // The line from which the system starts to read logs. The value 0 indicates that the system reads logs from line 0. 
      line = 500    // The number of rows that are returned for the current API request. Up to 1,000,000 rows can be returned. If a large number of lines are read at a time, the network latency increases, and the client-side processing speed decreases. 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 code example

      For more information, see Overview of Simple Log Service SDK for Python.

      # The Simple Log Service endpoint.
      endpoint = '' 
      # 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:
          # The execution result. 
              res4.log_print()   

      Java code example

      For more information, see Overview of 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, up to 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;
                  }
      }