Setelah Anda mengumpulkan log, Anda dapat memanggil operasi GetLogs untuk mengkueri log yang telah dikumpulkan. Topik ini menyediakan contoh cara mengkueri log tersebut dengan memanggil operasi GetLogs.
Prasyarat
Buat RAM user dan berikan izin yang diperlukan. Untuk informasi selengkapnya, lihat Buat RAM user dan berikan izin.
Konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET. Untuk informasi selengkapnya, lihat Konfigurasikan variabel lingkungan di Linux, macOS, dan Windows.
PentingPasangan AccessKey dari Akun Alibaba Cloud memiliki izin untuk mengakses semua operasi API. Kami menyarankan agar Anda menggunakan pasangan AccessKey milik RAM user untuk pemanggilan API dan operasi sehari-hari.
Untuk mencegah risiko keamanan, jangan hard-code ID AccessKey dan AccessKey Secret Anda ke dalam kode proyek. Menyimpan kredensial secara langsung dalam kode dapat membocorkannya, sehingga membahayakan keamanan seluruh sumber daya dalam akun Anda.
Instal Log Service SDK untuk Python. Untuk informasi selengkapnya, lihat Instal Log Service SDK untuk Python.
Log telah dikumpulkan. Untuk informasi selengkapnya, lihat Ikhtisar pengumpulan data.
Pelajari parameter operasi GetLogs. Untuk informasi selengkapnya, lihat GetLogs.
Catatan penggunaan
Topik ini menggunakan titik akhir publik untuk wilayah China (Hangzhou) sebagai contoh:
https://cn-hangzhou.log.aliyuncs.com.Jika Anda mengakses Log Service dari layanan Alibaba Cloud lainnya yang berada dalam wilayah yang sama dengan Project Anda, gunakan titik akhir internal:
https://cn-hangzhou-intranet.log.aliyuncs.com.Untuk daftar wilayah yang didukung beserta titik akhirnya, lihat Endpoints.
Anda dapat memanggil metode
is_completed()pada objek respons dari kode SDK untuk menentukan apakah kueri tersebut presisi.Jika metode
is_completed()mengembalikan nilaitrue, hal ini menunjukkan bahwa kueri saat ini telah lengkap dan akurat, serta hasil kueri yang dikembalikan bersifat lengkap.Jika metode
is_completed()mengembalikan nilaifalse, hal ini menunjukkan bahwa kueri telah selesai tetapi hasilnya tidak presisi, artinya hasil kueri yang dikembalikan tidak lengkap. Anda perlu mengulangi permintaan untuk mendapatkan hasil kueri yang lengkap. Untuk informasi lebih lanjut tentang kueri tidak presisi, lihat Kemungkinan penyebab kueri tidak presisi.
Contoh log mentah
body_bytes_sent:1750
host:www.example.com
http_referer:www.example.com
http_user_agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27
http_x_forwarded_for:203.0.XX.XX
remote_addr:203.0.XX.XX
remote_user:p288
request_length:13741
request_method:GET
request_time:71
request_uri:/request/path-1/file-1
http_code:200
time_local:11/Aug/2021:06:52:27
upstream_response_time:0.66Contoh
Kode Python berikut memberikan contoh cara mengkueri dan menganalisis log.
Dalam operasi GetLogs, Anda dapat menggunakan parameter query untuk mengatur pernyataan kueri dan analisis, sebagai berikut:
Jika parameter
queryhanya diatur ke pernyataan pencarian, parameterlineberlaku dan digunakan untuk mengontrol jumlah log yang dikembalikan.Jika parameter
querydiatur ke pernyataan kueri dan analisis, parameterlinediabaikan. Gunakan sintaksis LIMIT untuk mengontrol jumlah baris yang dikembalikan. Untuk informasi selengkapnya, lihat klausul LIMIT.
Untuk informasi selengkapnya tentang pernyataan kueri, lihat Sintaks dasar.
Contoh 1: Kueri log menggunakan kata kunci
Gunakan pernyataan pencarian path-0/file-5 untuk mengkueri log. Berikut contohnya:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir untuk Log Service. Untuk informasi selengkapnya, lihat Endpoints.
# Contoh ini menggunakan titik akhir untuk wilayah China (Hangzhou). Ganti dengan titik akhir aktual Anda.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Contoh ini mengambil ID AccessKey dan AccessKey Secret dari variabel lingkungan.
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# Nama Project dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat client Log Service.
client = LogClient(endpoint, access_key_id, access_key)
# Kueri log menggunakan kata kunci 'path-0/file-5'.
query = 'path-0/file-5'
# Parameter from_time dan to_time menentukan rentang waktu kueri dalam format stempel waktu UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("ready to query logs from logstore %s" % logstore)
# Pada contoh ini, parameter query menentukan pernyataan pencarian, dan parameter line membatasi hasil menjadi 3 entri log.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Cetak hasil kueri.
print('-------------Query is started.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Query is finished.-------------')
if __name__ == '__main__':
main()
Respons:
ready to query logs from logstore your-logstore-name
-------------Query is started.-------------
dict_items([ ('remote_user', 'nhf3g'), ('time_local', '14/Feb/2022:06:49:28'), ('request_uri', '/request/path-0/file-5')...])
dict_items([ ('remote_user', 'ysu'), ('time_local', '14/Feb/2022:06:49:38'), ('request_uri', '/request/path-0/file-5')...])
dict_items([ ('remote_user', 'l_k'), ('time_local', '14/Feb/2022:06:49:38'), ('request_uri', '/request/path-0/file-5')...])
-------------Query is finished.-------------
Process finished with exit code 0Contoh 2: Kueri log dengan menentukan bidang
Gunakan pernyataan pencarian request_method:POST untuk mengkueri log yang metode permintaannya adalah POST. Untuk membatasi jumlah entri log yang dikembalikan, atur line menjadi 3. Berikut contohnya:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir untuk Log Service. Contoh ini menggunakan titik akhir untuk wilayah China (Hangzhou).
# Ganti nilainya dengan titik akhir aktual.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Contoh ini mengambil ID AccessKey dan AccessKey Secret dari variabel lingkungan.
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# Nama Project dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat client Log Service.
client = LogClient(endpoint, access_key_id, access_key)
# Kueri log berdasarkan bidang tertentu.
# Kueri log yang metode permintaannya adalah POST.
query = 'request_method:POST'
# Parameter from_time dan to_time menentukan rentang waktu kueri dalam format stempel waktu UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("ready to query logs from logstore %s" % logstore)
# Pada contoh ini, parameter query menentukan pernyataan pencarian, dan parameter line membatasi hasil menjadi 3 entri log.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Cetak hasil kueri.
print('-------------Query is started.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Query is finished.-------------')
if __name__ == '__main__':
main()
Respons:
ready to query logs from logstore your-logstore-name
-------------Query is started.-------------
dict_items([ ('remote_user', 'tv0m'), ('time_local', '14/Feb/2022:06:59:08'), ('request_method', 'POST')...])
dict_items([ ('remote_user', '6joc'), ('time_local', '14/Feb/2022:06:59:08'), ('request_method', 'POST')...])
dict_items([ ('remote_user', 'da8'), ('time_local', '14/Feb/2022:06:59:08'), ('request_method', 'POST')...])
-------------Query is finished.-------------
Process finished with exit code 0Contoh 3: Analisis log menggunakan pernyataan SQL
Gunakan pernyataan kueri dan analisis request_method:POST|select COUNT(*) as pv untuk menghitung jumlah permintaan POST, seperti yang ditunjukkan pada contoh berikut:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir untuk Log Service. Contoh ini menggunakan titik akhir untuk wilayah China (Hangzhou).
# Ganti nilainya dengan titik akhir aktual.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Contoh ini mengambil ID AccessKey dan AccessKey Secret dari variabel lingkungan.
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# Nama Project dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat client Log Service.
client = LogClient(endpoint, access_key_id, access_key)
# Analisis log menggunakan pernyataan analisis.
# Kueri log yang metode permintaannya adalah POST dan hitung jumlah tampilan halaman (PV).
query = 'request_method:POST|select COUNT(*) as pv'
# Parameter from_time dan to_time menentukan rentang waktu kueri dalam format stempel waktu UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("ready to query logs from logstore %s" % logstore)
# Pada contoh ini, parameter query menentukan pernyataan pencarian dan analisis. Parameter line diabaikan.
# Jumlah hasil ditentukan oleh pernyataan analisis, yang mengembalikan satu baris.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Cetak hasil kueri.
print('-------------Query is started.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Query is finished.-------------')
if __name__ == '__main__':
main()
Respons:
ready to query logs from logstore nginx-moni
-------------Query is started.-------------
dict_items([('pv', '2918')])
-------------Query is finished.-------------
Process finished with exit code 0Contoh 4: Analisis log menggunakan klausa GROUP BY
Gunakan pernyataan kueri dan analisis request_method:POST|select host, COUNT(*) as pv group by host order by pv desc limit 5 untuk menghitung jumlah permintaan POST, mengelompokkan hasil berdasarkan host, dan mengurutkan hasil berdasarkan PV secara menurun. Berikut contohnya:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir untuk Log Service. Contoh ini menggunakan titik akhir untuk wilayah China (Hangzhou).
# Ganti nilainya dengan titik akhir aktual.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Contoh ini mengambil ID AccessKey dan AccessKey Secret dari variabel lingkungan.
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# Nama Project dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat client Log Service.
client = LogClient(endpoint, access_key_id, access_key)
# Hitung permintaan POST, kelompokkan berdasarkan host, dan urutkan berdasarkan jumlah PV.
# Klausa LIMIT dalam pernyataan analisis membatasi output menjadi 5 hasil.
query = 'request_method:POST|select host, COUNT(*) as pv group by host order by pv desc limit 5'
# Parameter from_time dan to_time menentukan rentang waktu kueri dalam format stempel waktu UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("ready to query logs from logstore %s" % logstore)
# Parameter query menentukan pernyataan pencarian dan analisis.
# Parameter line dan reverse diabaikan. Jumlah dan urutan hasil ditentukan oleh pernyataan analisis.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Cetak hasil kueri.
print('-------------Query is started.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Query is finished.-------------')
if __name__ == '__main__':
main()
Respons:
ready to query logs from logstore nginx-moni
-------------Query is started.-------------
dict_items([('host', 'www.example.com'), ('pv', '7')])
dict_items([('host', 'www.example.org'), ('pv', '6')])
dict_items([('host', 'www.example.net'), ('pv', '6')])
dict_items([('host', 'www.example.edu'), ('pv', '5')])
dict_items([('host', 'www.aliyundoc.com'), ('pv', '4')])
-------------Query is finished.-------------
Process finished with exit code 0Contoh 5: Menulis bidang tertentu dari log yang diperoleh ke file lokal
Gunakan pernyataan pencarian path-0/file-5 untuk mengkueri log, lalu tulis nilai bidang tertentu dari hasil ke file lokal bernama log.txt. Kode berikut menunjukkan contohnya:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir untuk Log Service. Contoh ini menggunakan titik akhir untuk wilayah China (Hangzhou).
# Ganti nilainya dengan titik akhir aktual.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Contoh ini mengambil ID AccessKey dan AccessKey Secret dari variabel lingkungan.
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# Nama Project dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat client Log Service.
client = LogClient(endpoint, access_key_id, access_key)
# Kueri log menggunakan kata kunci 'path-0/file-5'.
query = 'path-0/file-5'
# Parameter from_time dan to_time menentukan rentang waktu kueri dalam format stempel waktu UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("ready to query logs from logstore %s" % logstore)
# Pada contoh ini, parameter query menentukan pernyataan pencarian, dan parameter line membatasi hasil menjadi 3 entri log.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Cetak hasil kueri.
print('-------------Query is started.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Query is finished.-------------')
# Ekstrak nilai kunci 'remote_user' dari setiap log dan simpan ke file lokal.
print('-------------Start writing logs to a local file.-------------')
for loglocal in response.get_logs():
filename = 'log.txt'
with open(filename, mode='a') as fileobject:
fileobject.write(loglocal.contents.get('remote_user')+'\n')
print('-------------Finished writing logs to the local file.-------------')
if __name__ == '__main__':
main() Respons:
ready to query logs from logstore your-logstore-name
-------------Query is started.-------------
dict_items([ ('remote_user', 'nhf3g'), ('time_local', '14/Feb/2022:06:49:28'), ('request_uri', '/request/path-0/file-5')...])
dict_items([ ('remote_user', 'ysu'), ('time_local', '14/Feb/2022:06:49:38'), ('request_uri', '/request/path-0/file-5')...])
dict_items([ ('remote_user', 'l_k'), ('time_local', '14/Feb/2022:06:49:38'), ('request_uri', '/request/path-0/file-5')...])
-------------Query is finished.-------------
-------------Start writing logs to a local file.-------------
-------------Finished writing logs to the local file.-------------
Process finished with exit code 0Contoh berikut menunjukkan isi file log.txt yang dihasilkan di direktori file GetLogsTest.py:
nhf3g
ysu
l_kReferensi
Pesan kesalahan menunjukkan bahwa pemanggilan API gagal. Untuk mengatasi kesalahan tersebut, lihat Kode kesalahan API.
Selain SDK eksklusifnya, Log Service juga mendukung SDK Alibaba Cloud umum. Untuk informasi selengkapnya tentang cara menggunakan SDK Alibaba Cloud, lihat Pusat SDK Log Service – Portal OpenAPI Alibaba Cloud.
Log Service menyediakan command-line interface (CLI) untuk mengotomatiskan konfigurasi. Untuk informasi selengkapnya, lihat Command-line interface (CLI) Log Service.