Setelah mengumpulkan log, Anda dapat memanggil operasi GetLogs untuk menanyakan log yang telah dikumpulkan. Topik ini memberikan contoh cara menanyakan log dengan menggunakan operasi GetLogs.
Prasyarat
Pengguna Resource Access Management (RAM) harus dibuat dan diberi izin yang diperlukan. Untuk informasi lebih lanjut, lihat Buat pengguna RAM dan berikan izin kepada pengguna RAM.
Variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET harus dikonfigurasi. Untuk informasi lebih lanjut, lihat Konfigurasikan variabel lingkungan di Linux, macOS, dan Windows.
PentingPasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk semua operasi API. Kami merekomendasikan agar Anda menggunakan pasangan AccessKey dari pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin O&M.
Kami merekomendasikan agar Anda tidak menyimpan ID AccessKey atau rahasia AccessKey dalam kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor, dan keamanan semua sumber daya dalam akun Anda mungkin terganggu.
SDK Layanan Log Sederhana untuk Python harus diinstal. Untuk informasi lebih lanjut, lihat Instal SDK Layanan Log Sederhana untuk Python.
Log harus sudah dikumpulkan. Untuk informasi lebih lanjut, lihat Ikhtisar pengumpulan data.
Anda harus familiar dengan parameter operasi GetLogs. Untuk informasi lebih lanjut, lihat GetLogs.
Catatan penggunaan
Dalam contoh ini, titik akhir publik Layanan Log Sederhana untuk wilayah China (Hangzhou) digunakan, yaitu
https://cn-hangzhou.log.aliyuncs.com. Jika Anda ingin mengakses Layanan Log Sederhana dengan menggunakan layanan Alibaba Cloud lainnya yang berada di wilayah yang sama dengan proyek Anda, Anda dapat menggunakan titik akhir internal Layanan Log Sederhana, yaituhttps://cn-hangzhou-intranet.log.aliyuncs.com. Untuk informasi lebih lanjut tentang pemetaan antara titik akhir dan wilayah yang didukung oleh Layanan Log Sederhana, lihat Titik akhir.Anda dapat memanggil metode
is_completed()dalam objek respons kode SDK untuk memeriksa apakah hasil kueri akurat.Jika metode
is_completed()mengembalikantrue, kueri berhasil dan hasil kueri akurat serta lengkap.Jika metode
is_completed()mengembalikanfalse, kueri berhasil, tetapi hasil kueri tidak akurat dan tidak lengkap. Untuk mendapatkan hasil lengkap, Anda harus mengulangi permintaan. Untuk informasi lebih lanjut tentang hasil kueri yang tidak akurat, lihat Penyebab.
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
Berikut adalah contoh kode Python yang menunjukkan cara menanyakan dan menganalisis log.
Anda dapat mengonfigurasi parameter query dalam operasi GetLogs untuk menentukan pernyataan pencarian. Perhatikan hal-hal berikut:
Jika Anda mengatur
queryhanya sebagai pernyataan pencarian, parameterlinevalid dan digunakan untuk menentukan jumlah maksimum log yang dapat dikembalikan.Jika Anda mengatur
querysebagai pernyataan kueri, parameterlinetidak valid. Anda harus menggunakan klausa LIMIT untuk menentukan jumlah maksimum log yang dapat dikembalikan. Untuk informasi lebih lanjut, lihat Klausa LIMIT.
Untuk informasi lebih lanjut tentang pernyataan kueri, lihat Sintaks Dasar.
Contoh 1: Menanyakan log menggunakan kata kunci
Gunakan pernyataan pencarian path-0/file-5 untuk menanyakan log. Contoh:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir Layanan Log Sederhana. Untuk informasi lebih lanjut, lihat Titik akhir. Dalam contoh ini, titik akhir Layanan Log Sederhana untuk wilayah China (Hangzhou) digunakan. Ganti nilai parameter dengan titik akhir sebenarnya.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Dalam contoh ini, ID AccessKey dan rahasia AccessKey diperoleh 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 proyek dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat klien Layanan Log Sederhana.
client = LogClient(endpoint, access_key_id, access_key)
# Gunakan kata kunci path-0/file-5 untuk menanyakan log.
query = 'path-0/file-5'
# Konfigurasikan parameter from_time dan to_time untuk menentukan waktu mulai dan waktu akhir rentang waktu tempat Anda ingin menanyakan log. Atur nilainya ke timestamp UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("siap untuk menanyakan log dari logstore %s" % logstore)
# Dalam contoh ini, parameter kueri diatur ke pernyataan pencarian dan parameter line diatur ke 3. Parameter line menentukan jumlah maksimum log yang dapat dikembalikan.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Tampilkan hasil kueri.
print('-------------Kueri dimulai.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Kueri selesai.-------------')
if __name__ == '__main__':
main()
Respons:
siap untuk menanyakan log dari logstore your-logstore-name
-------------Kueri dimulai.-------------
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')...])
-------------Kueri selesai.-------------
Proses selesai dengan kode keluar 0Contoh 2: Menanyakan log dengan menentukan bidang
Gunakan pernyataan pencarian request_method:POST untuk menanyakan log yang metode permintaannya adalah POST. Parameter line menentukan jumlah maksimum log yang dapat dikembalikan. Dalam contoh ini, line diatur ke 3. Contoh:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir Layanan Log Sederhana. Dalam contoh ini, titik akhir Layanan Log Sederhana untuk wilayah China (Hangzhou) digunakan. Ganti nilai parameter dengan titik akhir sebenarnya.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Dalam contoh ini, ID AccessKey dan rahasia AccessKey diperoleh 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 proyek dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat klien Layanan Log Sederhana.
client = LogClient(endpoint, access_key_id, access_key)
# Tentukan bidang untuk menanyakan log.
# Tanyakan log yang metode permintaannya adalah POST.
query = 'request_method:POST'
# Konfigurasikan parameter from_time dan to_time untuk menentukan waktu mulai dan waktu akhir rentang waktu tempat Anda ingin menanyakan log. Atur nilainya ke timestamp UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("siap untuk menanyakan log dari logstore %s" % logstore)
# Dalam contoh ini, parameter kueri diatur ke pernyataan pencarian dan parameter line diatur ke 3. Parameter line menentukan jumlah maksimum log yang dapat dikembalikan.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Tampilkan hasil kueri.
print('-------------Kueri dimulai.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Kueri selesai.-------------')
if __name__ == '__main__':
main()
Respons:
siap untuk menanyakan log dari logstore your-logstore-name
-------------Kueri dimulai.-------------
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')...])
-------------Kueri selesai.-------------
Proses selesai dengan kode keluar 0Contoh 3: Menganalisis log menggunakan pernyataan SQL
Gunakan pernyataan kueri request_method:POST|select COUNT(*) as pv untuk menanyakan log yang metode permintaannya adalah POST dan hitung jumlah tampilan halaman (PV) untuk permintaan POST. Contoh:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir Layanan Log Sederhana. Dalam contoh ini, titik akhir Layanan Log Sederhana untuk wilayah China (Hangzhou) digunakan. Ganti nilai parameter dengan titik akhir sebenarnya.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Dalam contoh ini, ID AccessKey dan rahasia AccessKey diperoleh 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 proyek dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat klien Layanan Log Sederhana.
client = LogClient(endpoint, access_key_id, access_key)
# Gunakan pernyataan SQL untuk menganalisis log.
# Tanyakan log yang metode permintaannya adalah POST dan hitung jumlah PV untuk permintaan POST.
query = 'request_method:POST|select COUNT(*) as pv'
# Konfigurasikan parameter from_time dan to_time untuk menentukan waktu mulai dan waktu akhir rentang waktu tempat Anda ingin menanyakan log. Atur nilainya ke timestamp UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("siap untuk menanyakan log dari logstore %s" % logstore)
# Dalam contoh ini, parameter kueri diatur ke pernyataan kueri dan parameter line tidak valid. Jumlah maksimum log yang dapat dikembalikan ditentukan oleh parameter kueri. Hanya satu log yang dapat dikembalikan.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Tampilkan hasil kueri.
print('-------------Kueri dimulai.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Kueri selesai.-------------')
if __name__ == '__main__':
main()
Respons:
siap untuk menanyakan log dari logstore nginx-moni
-------------Kueri dimulai.-------------
dict_items([('pv', '2918')])
-------------Kueri selesai.-------------
Proses selesai dengan kode keluar 0Contoh 4: Menganalisis log menggunakan klausa GROUP BY
Gunakan pernyataan kueri request_method:POST|select host, COUNT(*) as pv group by host order by pv desc limit 5 untuk menanyakan log yang metode permintaannya adalah POST, kelompokkan log yang diperoleh berdasarkan host, dan urutkan log yang diperoleh berdasarkan PV. Contoh:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir Layanan Log Sederhana. Dalam contoh ini, titik akhir Layanan Log Sederhana untuk wilayah China (Hangzhou) digunakan. Ganti nilai parameter dengan titik akhir sebenarnya.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Dalam contoh ini, ID AccessKey dan rahasia AccessKey diperoleh 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 proyek dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat klien Layanan Log Sederhana.
client = LogClient(endpoint, access_key_id, access_key)
# Tanyakan log yang metode permintaannya adalah POST, kelompokkan log yang diperoleh berdasarkan host, dan urutkan log yang diperoleh berdasarkan PV.
# Gunakan klausa LIMIT untuk membatasi jumlah maksimum log yang dapat dikembalikan menjadi 5.
query = 'request_method:POST|select host, COUNT(*) as pv group by host order by pv desc limit 5'
# Konfigurasikan parameter from_time dan to_time untuk menentukan waktu mulai dan waktu akhir rentang waktu tempat Anda ingin menanyakan log. Atur nilainya ke timestamp UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("siap untuk menanyakan log dari logstore %s" % logstore)
# Dalam contoh ini, parameter kueri diatur ke pernyataan kueri dan parameter line tidak valid. Jumlah maksimum log yang dapat dikembalikan ditentukan oleh parameter kueri. Maksimal lima log dapat dikembalikan. Parameter reverse tidak valid. Log diurutkan berdasarkan urutan yang ditentukan dalam pernyataan SQL.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Tampilkan hasil kueri.
print('-------------Kueri dimulai.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Kueri selesai.-------------')
if __name__ == '__main__':
main()
Respons:
siap untuk menanyakan log dari logstore nginx-moni
-------------Kueri dimulai.-------------
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')])
-------------Kueri selesai.-------------
Proses selesai dengan kode keluar 0Contoh 5: Tulis bidang tertentu dalam log yang diperoleh ke file lokal
Gunakan pernyataan pencarian path-0/file-5 untuk menanyakan log dan tulis nilai bidang tertentu dalam log yang diperoleh ke file lokal bernama log.txt. Contoh:
# encoding: utf-8
import time
import os
from aliyun.log import *
def main():
# Titik akhir Layanan Log Sederhana. Dalam contoh ini, titik akhir Layanan Log Sederhana untuk wilayah China (Hangzhou) digunakan. Ganti nilai parameter dengan titik akhir sebenarnya.
endpoint = 'cn-hangzhou.log.aliyuncs.com'
# Dalam contoh ini, ID AccessKey dan rahasia AccessKey diperoleh 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 proyek dan Logstore.
project = 'your-project-name'
logstore = 'your-logstore-name'
# Buat klien Layanan Log Sederhana.
client = LogClient(endpoint, access_key_id, access_key)
# Gunakan kata kunci path-0/file-5 untuk menanyakan log.
query = 'path-0/file-5'
# Konfigurasikan parameter from_time dan to_time untuk menentukan waktu mulai dan waktu akhir rentang waktu tempat Anda ingin menanyakan log. Atur nilainya ke timestamp UNIX.
from_time = int(time.time()) - 3600
to_time = time.time() + 3600
print("siap untuk menanyakan log dari logstore %s" % logstore)
# Dalam contoh ini, parameter kueri diatur ke pernyataan pencarian dan parameter line diatur ke 3. Parameter line menentukan jumlah maksimum log yang dapat dikembalikan.
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# Tampilkan hasil kueri.
print('-------------Kueri dimulai.-------------')
for log in response.get_logs():
print(log.contents.items())
print('-------------Kueri selesai.-------------')
# Ekstrak nilai bidang kunci dari log yang diperoleh dan simpan nilainya ke file lokal.
print('-------------Mulai menulis log ke file lokal.-------------')
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('-------------Selesai menulis log ke file lokal.-------------')
if __name__ == '__main__':
main() Respons:
siap untuk menanyakan log dari logstore your-logstore-name
-------------Kueri dimulai.-------------
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')...])
-------------Kueri selesai.-------------
-------------Mulai menulis log ke file lokal.-------------
-------------Selesai menulis log ke file lokal.-------------
Proses selesai dengan kode keluar 0Berikut adalah contoh isi file log.txt yang dihasilkan di direktori file GetLogsTest.py:
nhf3g
ysu
l_kReferensi
Jika respons yang dikembalikan oleh Layanan Log Sederhana berisi informasi kesalahan setelah Anda memanggil operasi API, pemanggilan gagal. Anda dapat menangani kesalahan berdasarkan kode kesalahan yang dikembalikan saat pemanggilan API gagal. Untuk informasi lebih lanjut, lihat Kode Kesalahan.
Layanan Log Sederhana juga kompatibel dengan SDK Alibaba Cloud. Untuk informasi lebih lanjut, lihat Simple Log Service_SDK Center_Alibaba Cloud OpenAPI Explorer.
Layanan Log Sederhana menyediakan antarmuka baris perintah (CLI) untuk memenuhi persyaratan konfigurasi otomatis dalam Layanan Log Sederhana. Untuk informasi lebih lanjut, lihat Ikhtisar CLI Layanan Log Sederhana.
Untuk informasi lebih lanjut tentang kode contoh, lihat Alibaba Cloud Simple Log Service SDK for Python di GitHub.