Jika pernyataan kueri mengembalikan sejumlah besar hasil kueri dan analisis, hasil tersebut akan ditampilkan dengan kecepatan lebih rendah. Simple Log Service menyediakan fitur kueri berhalaman untuk membatasi jumlah log yang dapat dikembalikan untuk setiap kueri. Topik ini menjelaskan metode halaman untuk hasil kueri dan analisis.
Ikhtisar metode halaman
Saat Anda memanggil operasi GetLogs untuk menanyakan log, Simple Log Service memungkinkan Anda untuk membagi halaman hasil kueri dan analisis. Pernyataan kueri dapat mencakup pernyataan pencarian dan pernyataan analitik. Metode halaman bervariasi antara pernyataan pencarian dan pernyataan analitik. Anda dapat menanyakan jumlah total log sebelum memanggil operasi GetLogs. Untuk informasi lebih lanjut, lihat GetHistograms.
Pernyataan pencarian: Menanyakan data mentah log menggunakan kata kunci. Anda dapat mengonfigurasi parameter offset dan line dalam operasi GetLogs untuk melakukan kueri berhalaman. Untuk informasi lebih lanjut, lihat Ikhtisar Pencarian Log.
Pernyataan analitik: Menganalisis hasil kueri menggunakan sintaks SQL. Anda dapat menggunakan klausa LIMIT untuk melakukan kueri berhalaman. Untuk informasi lebih lanjut, lihat Ikhtisar Kueri dan Analisis Log dan Klausa LIMIT.
Contoh halaman berdasarkan metode halaman
Kode berikut memberikan contoh cara membagi halaman hasil kueri dan analisis berdasarkan metode halaman. Anda dapat memilih metode halaman sesuai dengan kebutuhan bisnis Anda.
Contoh pembagian halaman hasil kueri
Saat melakukan kueri berhalaman, nilai parameter offset meningkat hingga semua log dibaca. Saat nilainya mencapai angka tertentu, 0 dikembalikan, dan proses selesai. Dalam hal ini, semua data yang diperlukan telah dibaca.
Kode sampel untuk implementasi halaman
offset = 0 # Baris dari mana sistem mulai membaca log. Nilai 0 menunjukkan bahwa sistem membaca log dari baris 0. line = 100 # Jumlah baris yang dikembalikan untuk permintaan API saat ini. Hingga 100 baris dapat dikembalikan. Jika Anda menetapkan parameter ini ke nilai lebih dari 100, hanya 100 baris yang dikembalikan. Baca 100 baris sekaligus. query = "status:200" # Kueri semua log di mana nilai bidang status adalah 200. while True: response = get_logstore_logs(query, offset, line) # Panggil operasi untuk membaca log. process (response) # Panggil logika kustom untuk memproses hasil yang dikembalikan. if response.get_count() == 0 && response.is_complete() Proses pembacaan selesai, dan loop saat ini berakhir. else offset += 100 # Nilai parameter offset bertambah menjadi 100. 100 baris berikutnya dibaca.Contoh kode Python
Untuk informasi lebih lanjut, lihat Ikhtisar SDK Simple Log Service untuk Python.
# Titik akhir Simple Log Service. endpoint = '' # Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh dari variabel lingkungan. accessKeyId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # Nama proyek. project = '' # Nama penyimpanan log. 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: # Hasil eksekusi. res4.log_print()Contoh kode Java
Untuk informasi lebih lanjut, lihat Ikhtisar SDK Simple Log Service untuk Java.
int log_offset = 0; int log_line = 100; // Jumlah baris yang dibaca sekaligus. Hingga 100 baris dapat dikembalikan. Jika Anda ingin membaca lebih dari 100 baris, gunakan parameter offset. Parameter offset dan line hanya berlaku untuk pernyataan pencarian yang menggunakan kata kunci. Jika Anda menggunakan pernyataan analitik, parameter offset dan line tidak valid. Jika Anda ingin pernyataan analitik mengembalikan lebih dari 100 baris, gunakan klausa LIMIT. while (true) { GetLogsResponse res4 = null; // Untuk setiap offset, 100 baris dibaca sekaligus. Jika operasi pembacaan gagal, hingga tiga kali percobaan ulang diperbolehkan. 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("Jumlah log yang dibaca:" + String.valueOf(res4.GetCount())); log_offset += log_line; if (res4.IsCompleted() && res4.GetCount() == 0) { break; } }
Contoh pembagian halaman hasil analisis
Anda dapat menggunakan klausa LIMIT untuk membagi halaman hasil analisis. Misalnya, jika Anda ingin menggunakan pernyataan
* | select count(1) , url group by urluntuk mengembalikan 1.000 baris, Anda dapat mengeksekusi pernyataan berikut untuk melakukan dua kueri berhalaman dan menanyakan 500 baris setiap kali:* | select count(1) , url group by url limit 0, 500 * | select count(1) , url group by url limit 500, 500Kode sampel untuk implementasi halaman
offset = 0 // Baris dari mana sistem mulai membaca log. Nilai 0 menunjukkan bahwa sistem membaca log dari baris 0. line = 500 // Jumlah baris yang dikembalikan untuk permintaan API saat ini. Hingga 1.000.000 baris dapat dikembalikan. Jika sejumlah besar baris dibaca sekaligus, latensi jaringan meningkat, dan kecepatan pemrosesan sisi klien menurun. Baca 500 baris sekaligus. query = "* | select count(1) , url group by url limit " while True: real_query = query + offset + "," + line response = get_logstore_logs(real_query) // Panggil operasi untuk membaca log. process (response) // Panggil logika kustom untuk memproses hasil yang dikembalikan. if response.get_count() == 0 Proses pembacaan selesai, dan loop saat ini berakhir. else offset += 500 // Nilai parameter offset bertambah menjadi 500. 500 baris berikutnya dibaca.Contoh kode Python
Untuk informasi lebih lanjut, lihat Ikhtisar SDK Simple Log Service untuk Python.
# Titik akhir Simple Log Service. endpoint = '' # Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh dari variabel lingkungan. accessKeyId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # Nama proyek. project = '' # Nama penyimpanan log. 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: # Hasil eksekusi. res4.log_print()Contoh kode Java
Untuk informasi lebih lanjut, lihat Ikhtisar SDK Simple Log Service untuk 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; // Untuk setiap offset, 500 baris dibaca sekaligus. Jika operasi pembacaan gagal, hingga tiga kali percobaan ulang diperbolehkan. 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("Jumlah log yang dibaca:" + String.valueOf(res4.GetCount())); log_offset += log_line; if (res4.GetCount() == 0) { break; } }