Dokumen ini berisi contoh kueri untuk entri log yang disimpan di bucket log yang diupgrade untuk menggunakan Log Analytics.
Di bucket ini, Anda dapat menjalankan kueri SQL dari halaman Log Analytics di konsol Google Cloud. Untuk contoh lainnya, lihat
repositori GitHub logging-analytics-samples
dan
security-analytics
.
Dokumen ini tidak menjelaskan SQL atau cara merutekan dan menyimpan entri log. Untuk mengetahui informasi tentang topik tersebut, lihat bagian Langkah berikutnya.
Sebelum memulai
Bagian ini menjelaskan langkah-langkah yang harus Anda selesaikan sebelum dapat menggunakan Log Analytics.
Mengonfigurasi bucket log
Pastikan bucket log Anda telah diupgrade untuk menggunakan Log Analytics:
-
Di konsol Google Cloud, buka halaman Logs Storage:
Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.
- Untuk setiap bucket log yang memiliki tampilan log yang ingin Anda buat kuerinya, pastikan kolom Log Analytics tersedia menampilkan Buka. Jika Upgrade ditampilkan, klik Upgrade dan selesaikan dialog.
Mengonfigurasi peran dan izin IAM
Bagian ini menjelaskan peran atau izin IAM yang diperlukan untuk menggunakan Log Analytics:
-
Untuk mendapatkan izin yang Anda perlukan guna menggunakan Log Analytics dan tampilan log kueri, minta administrator untuk memberi Anda peran IAM berikut di project Anda:
-
Untuk membuat kueri bucket log
_Required
dan_Default
: Logs Viewer (roles/logging.viewer
) -
Untuk membuat kueri semua tampilan log dalam project:
Logs View Accessor (
roles/logging.viewAccessor
)
Anda dapat membatasi akun utama ke tampilan log tertentu dengan menambahkan kondisi IAM ke pemberian peran Logs View Accessor yang dilakukan di tingkat project, atau dengan menambahkan binding IAM ke file kebijakan tampilan log. Untuk mengetahui informasi selengkapnya, lihat Mengontrol akses ke tampilan log.
Izin ini sama dengan izin yang Anda perlukan untuk melihat entri log di halaman Logs Explorer. Untuk mengetahui informasi tentang peran tambahan yang Anda perlukan untuk membuat kueri tampilan di bucket yang ditentukan pengguna atau untuk membuat kueri tampilan
_AllLogs
dari bucket log_Default
, lihat Peran Cloud Logging. -
Untuk membuat kueri bucket log
Cara menggunakan kueri ini
Untuk menggunakan kueri yang ditampilkan dalam dokumen ini di halaman Log Analytics, ganti TABLE_NAME_OF_LOG_VIEW dengan nama tabel untuk tampilan log yang ingin Anda buat kuerinya.
Untuk membuat kueri tampilan log, dalam klausa FROM
,
gunakan format berikut:
FROM `PROJECT_ID.LOCATION.BUCKET_ID.VIEW_ID`
Berikut ini penjelasan arti kolom dalam ekspresi sebelumnya:
- PROJECT_ID: ID project.
- LOCATION: Lokasi tampilan log.
- BUCKET_ID: Nama atau ID bucket log.
- VIEW_ID: ID tampilan log.
Jika membuat set data BigQuery tertaut, Anda dapat membuat kueri set data tertaut dari halaman BigQuery Studio.
Di halaman tersebut, ganti TABLE_NAME_OF_LOG_VIEW dengan
jalur ke tabel dalam set data tertaut.
Misalnya, untuk membuat kueri tampilan _AllLogs
pada set data tertaut mydataset
yang ada dalam project myproject
, tetapkan kolom ini ke
myproject.mydataset._AllLogs
.
Buka halaman Log Analytics
Untuk membuka halaman Log Analytics, lakukan langkah-langkah berikut:
-
Di konsol Google Cloud, buka halaman Log Analytics:
Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.
Opsional: Untuk mengidentifikasi skema tampilan log, dalam daftar Tampilan log, temukan tampilan, lalu pilih nama tampilan.
Skema akan ditampilkan. Anda dapat menggunakan kolom Filter untuk menemukan kolom tertentu. Anda tidak dapat mengubah skema.
Untuk mengetahui informasi tentang cara mengakses kueri default untuk tampilan log, lihat Mengkueri dan menganalisis log dengan Log Analytics.
Filter log
Kueri SQL menentukan entri mana dalam tampilan log yang akan diproses, lalu mengelompokkan entri ini dan melakukan operasi agregat. Jika tidak ada operasi pengelompokan dan agregasi yang tercantum, hasil kueri akan menyertakan baris yang dipilih oleh operasi filter. Contoh di bagian ini menggambarkan pemfilteran.
Memfilter menurut waktu
Untuk menetapkan rentang waktu kueri, sebaiknya gunakan pemilih rentang waktu. Pemilih ini digunakan secara otomatis saat kueri
tidak menentukan kolom timestamp
dalam klausa WHERE
.
Misalnya, untuk melihat data selama seminggu terakhir, pilih 7 hari terakhir dari pemilih rentang waktu. Anda juga dapat menggunakan pemilih rentang waktu untuk menentukan waktu mulai dan waktu berakhir, menentukan waktu untuk melihat sekitar, dan mengubah zona waktu.
Jika Anda menyertakan kolom timestamp
dalam klausa WHERE
, setelan pemilih
rentang waktu tidak akan digunakan. Contoh berikut memfilter data dengan menggunakan fungsi TIMESTAMP_SUB
, yang memungkinkan Anda menentukan interval lihat balik dari waktu saat ini:
WHERE
timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
Untuk mengetahui informasi selengkapnya tentang cara memfilter menurut waktu, lihat Fungsi waktu dan Fungsi stempel waktu.
Filter menurut resource
Untuk memfilter menurut resource, tambahkan batasan resource.type
.
Misalnya, kueri berikut membaca data jam terbaru, lalu mempertahankan baris yang jenis resource-nya cocok dengan gce_instance
, lalu mengurutkan dan menampilkan hingga 100 entri:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
resource.type = "gce_instance"
ORDER BY timestamp ASC
LIMIT 100
Filter menurut tingkat keparahan
Anda dapat memfilter menurut tingkat keparahan tertentu dengan batasan seperti
severity = 'ERROR'
. Opsi lainnya adalah menggunakan pernyataan IN
dan menentukan kumpulan nilai yang valid.
Misalnya, kueri berikut membaca data satu jam terakhir, lalu
hanya mempertahankan baris yang berisi kolom severity
dengan nilai
'INFO'
atau 'ERROR'
:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
severity IS NOT NULL AND
severity IN ('INFO', 'ERROR')
ORDER BY timestamp ASC
LIMIT 100
Kueri sebelumnya memfilter berdasarkan nilai kolom severity
. Namun,
Anda juga dapat menulis kueri yang memfilter berdasarkan nilai numerik keparahan log.
Misalnya, jika Anda mengganti baris severity
dengan baris berikut, kueri akan menampilkan semua entri log yang tingkat keparahannya minimal NOTICE
:
severity_number IS NOT NULL AND
severity_number > 200
Untuk informasi tentang nilai yang di-enumerasi, lihat
LogSeverity
.
Filter menurut nama log
Untuk memfilter menurut nama log, Anda dapat menambahkan batasan pada nilai
kolom log_name
atau log_id
. Kolom log_name
menyertakan jalur
resource. Artinya, kolom ini memiliki nilai seperti projects/myproject/logs/mylog
.
Kolom log_id
hanya menyimpan nama log seperti mylog
.
Misalnya, kueri berikut membaca data jam terbaru, lalu mempertahankan baris tersebut dengan nilai di kolom log_id
adalah cloudaudit.googleapis.com/data_access
, lalu mengurutkan dan menampilkan hasilnya:
SELECT
timestamp, log_id, severity, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
log_id = "cloudaudit.googleapis.com/data_access"
ORDER BY timestamp ASC
LIMIT 100
Memfilter menurut label resource
Sebagian besar deskripsi resource yang dipantau menentukan label yang digunakan untuk mengidentifikasi resource tertentu. Misalnya, deskripsi untuk instance Compute Engine menyertakan label untuk zona, project ID, dan instance ID. Saat entri log ditulis, nilai akan ditetapkan ke setiap kolom. Berikut adalah contohnya:
{
type: "gce_instance"
labels: {
instance_id: "1234512345123451"
project_id: "my-project"
zone: "us-central1-f"
}
}
Karena jenis data kolom labels
adalah JSON, menyertakan batasan
seperti resource.labels.zone = "us-centra1-f"
dalam kueri akan menyebabkan error
sintaksis. Untuk mendapatkan nilai kolom dengan jenis data JSON, gunakan fungsi
JSON_VALUE
.
Misalnya, kueri berikut membaca data terbaru, lalu mempertahankan
baris tersebut dengan resource berupa instance Compute Engine yang
berada di zona us-central1-f
:
SELECT
timestamp, log_name, severity, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
resource.type = "gce_instance" AND
JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC
LIMIT 100
Untuk informasi tentang semua fungsi yang dapat mengambil dan mengubah data JSON, lihat fungsi JSON.
Memfilter menurut permintaan HTTP
Untuk memfilter tampilan log agar hanya menyertakan entri log yang sesuai dengan permintaan atau
balasan HTTP, tambahkan batasan http_request IS NOT NULL
:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL
ORDER BY timestamp
LIMIT 100
Kueri berikut hanya menyertakan baris yang sesuai dengan permintaan GET
atau POST
:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL AND
http_request.request_method IN ('GET', 'POST')
ORDER BY timestamp ASC
LIMIT 100
Memfilter menurut status HTTP
Untuk memfilter menurut status HTTP, ubah klausa WHERE
agar kolom http_request.status
ditentukan:
SELECT
timestamp, log_name, http_request.status, http_request, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL AND
http_request.status IS NOT NULL
ORDER BY timestamp ASC
LIMIT 100
Untuk menentukan jenis data yang disimpan di kolom, lihat skema atau tampilkan
kolom. Hasil kueri sebelumnya menunjukkan bahwa kolom http_request.status
menyimpan nilai bilangan bulat.
Memfilter berdasarkan kolom dengan jenis JSON
Untuk mengekstrak nilai dari kolom yang jenis datanya adalah JSON, gunakan fungsi JSON_VALUE
.
Pertimbangkan kueri berikut:
SELECT
json_payload
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload.status IS NOT NULL
dan
SELECT
json_payload
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
JSON_VALUE(json_payload.status) IS NOT NULL
Kueri sebelumnya menguji nilai kolom json_payload
dalam
entri log. Kedua kueri tersebut
akan menghapus entri log yang tidak berisi kolom berlabel json_payload
.
Perbedaan antara kedua kueri ini adalah baris terakhir, yang menentukan
apa yang diuji terhadap NULL
. Sekarang, pertimbangkan tampilan log yang memiliki
dua entri log. Untuk satu entri log, kolom json_payload
memiliki format
berikut:
{
status: {
measureTime: "1661517845"
}
}
Untuk entri log lainnya, kolom json_payload
memiliki struktur yang berbeda:
{
@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
jobName: "projects/my-project/locations/us-central1/jobs/test1"
relativeUrl: "/food=cake"
status: "NOT_FOUND"
targetType: "APP_ENGINE_HTTP"
}
Kedua entri log sebelumnya memenuhi batasan
json_payload.status IS NOT NULL
.
Artinya, hasil kueri pertama menyertakan kedua entri log.
Namun, jika batasan adalah JSON_VALUE(json_payload.status) IS NOT NULL
,
hanya entri log kedua yang disertakan dalam hasil kueri.
Memfilter menurut ekspresi reguler
Untuk menampilkan substring yang cocok dengan ekspresi reguler, gunakan fungsi
REGEXP_EXTRACT
. Jenis nilai yang ditampilkan fungsi ini adalah
STRING
atau BYTES
.
Kueri berikut menampilkan entri log terbaru yang diterima, mempertahankan
entri tersebut dengan kolom json_payload.jobName
, lalu menampilkan
bagian nama yang dimulai dengan test
:
SELECT
timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload.jobName IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20
Untuk contoh tambahan, lihat
dokumentasi REGEXP_EXTRACT
.
Untuk contoh ekspresi reguler lainnya yang dapat Anda gunakan, lihat Fungsi, operator, dan kondisional.
Kueri yang ditampilkan dalam contoh ini tidak efisien. Untuk pencocokan substring, seperti
yang diilustrasikan, gunakan fungsi CONTAINS_SUBSTR
.
Menggabungkan dan mengelompokkan entri log
Bagian ini dibuat berdasarkan contoh sebelumnya dan menggambarkan cara Anda dapat
mengelompokkan dan menggabungkan entri log. Jika Anda tidak menentukan pengelompokan, tetapi menentukan agregasi, satu hasil akan dicetak karena SQL memperlakukan semua baris yang memenuhi klausa WHERE
sebagai satu grup.
Setiap ekspresi SELECT
harus disertakan dalam kolom grup atau digabungkan.
Mengelompokkan menurut waktu
Untuk mengelompokkan data berdasarkan waktu, gunakan fungsi TIMESTAMP_TRUNC
, yang memotong stempel waktu ke tingkat perincian yang ditentukan seperti MINUTE
. Misalnya, stempel waktu 15:30:11
, yang diformat sebagai hours:minutes:seconds
, menjadi 15:30:00
jika tingkat perincian ditetapkan ke MINUTE
.
Kueri berikut membaca data yang diterima dalam interval yang ditentukan oleh pemilih rentang waktu, lalu mempertahankan baris tersebut dengan nilai kolom json_payload.status
bukan NULL.
Kueri memotong stempel waktu pada setiap baris berdasarkan jam, lalu mengelompokkan
baris berdasarkan stempel waktu dan status yang terpotong:
SELECT
TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
JSON_VALUE(json_payload.status) AS status,
COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload IS NOT NULL AND
JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY hour,status
ORDER BY hour ASC
Untuk contoh tambahan, lihat
dokumentasi TIMESTAMP_TRUNC
.
Untuk informasi tentang fungsi berbasis waktu lainnya, lihat
Fungsi tanggal dan waktu.
Kelompokkan menurut resource
Kueri berikut membaca data satu jam terakhir, lalu mengelompokkan entri log menurut jenis resource. Kemudian, kode ini menghitung jumlah baris untuk setiap jenis resource, dan menampilkan tabel dengan dua kolom. Kolom pertama mencantumkan jenis resource, sedangkan kolom kedua adalah jumlah baris untuk jenis resource tersebut:
SELECT
resource.type, COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
GROUP BY resource.type
LIMIT 100
Kelompokkan menurut tingkat keparahan
Kueri berikut membaca data jam terbaru, lalu mempertahankan baris yang memiliki kolom tingkat keparahan. Kueri kemudian mengelompokkan baris menurut tingkat keparahan dan menghitung jumlah baris untuk setiap grup:
SELECT
severity, COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100
Kelompokkan menurut log_id
Hasil kueri berikut adalah tabel dengan dua kolom. Kolom pertama mencantumkan nama log dan kolom kedua mencantumkan jumlah entri log yang ditulis ke log. Kueri mengurutkan hasil berdasarkan jumlah entri:
SELECT
log_id, COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100
Menghitung latensi rata-rata untuk permintaan HTTP
Kueri berikut mengilustrasikan pengelompokan menurut beberapa kolom, dan penghitungan nilai rata-rata. Kueri mengelompokkan baris berdasarkan URL yang terdapat dalam permintaan HTTP dan berdasarkan nilai kolom labels.checker_location
. Setelah
mengelompokkan baris, kueri akan menghitung latensi rata-rata untuk setiap grup:
SELECT
JSON_VALUE(labels.checker_location) AS location,
AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL AND
http_request.request_method IN ('GET')
GROUP BY http_request.request_url, location
ORDER BY location
LIMIT 100
Dalam ekspresi sebelumnya, JSON_VALUE
diperlukan untuk mengekstrak nilai
kolom labels.checker_location
karena jenis data untuk
labels
adalah JSON.
Namun, Anda tidak menggunakan fungsi ini untuk mengekstrak nilai dari
kolom http_request.latency.seconds
. Kolom kedua memiliki jenis data
bilangan bulat.
Menghitung byte rata-rata yang dikirim untuk pengujian subjaringan
Kueri berikut mengilustrasikan cara menampilkan jumlah rata-rata byte yang dikirim menurut lokasi.
Kueri membaca data jam terbaru, lalu hanya mempertahankan baris yang kolom jenis resource-nya adalah gce_subnetwork
dan kolom json_payload
-nya bukan NULL. Selanjutnya, kueri mengelompokkan baris berdasarkan lokasi resource. Tidak seperti contoh sebelumnya, saat data disimpan sebagai nilai
numerik, nilai kolom bytes_sent
adalah string sehingga Anda harus
mengonversi nilai tersebut menjadi FLOAT64
sebelum menghitung rata-rata:
SELECT JSON_VALUE(resource.labels.location) AS location,
AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
resource.type = "gce_subnetwork" AND
json_payload IS NOT NULL
GROUP BY location
LIMIT 100
Hasil kueri sebelumnya adalah tabel yang setiap barisnya mencantumkan lokasi dan byte rata-rata yang dikirim untuk lokasi tersebut.
Untuk informasi tentang semua fungsi yang dapat mengambil dan mengubah data JSON, lihat fungsi JSON.
Untuk informasi tentang CAST
dan fungsi konversi lainnya, lihat
Fungsi konversi.
Menghitung entri log dengan kolom yang cocok dengan pola
Untuk menampilkan substring yang cocok dengan ekspresi reguler, gunakan fungsi
REGEXP_EXTRACT
. Jenis nilai yang ditampilkan fungsi ini adalah
STRING
atau BYTES
.
Kueri berikut mempertahankan entri log yang nilai kolom json_payload.jobName
-nya bukan NULL.
Kemudian, kode ini mengelompokkan entri berdasarkan akhiran nama yang dimulai
dengan test
. Terakhir, kueri menghitung jumlah entri di setiap grup:
SELECT
REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20
Untuk contoh tambahan, lihat
dokumentasi REGEXP_EXTRACT
.
Untuk contoh ekspresi reguler lainnya yang dapat Anda gunakan, lihat Fungsi, operator, dan kondisional.
Penelusuran lintas kolom
Bagian ini menjelaskan dua pendekatan berbeda yang dapat Anda gunakan untuk menelusuri beberapa kolom tabel.
Penelusuran berbasis token
Untuk menelusuri tampilan log guna menemukan entri yang cocok dengan kumpulan istilah penelusuran,
gunakan fungsi SEARCH
. Fungsi ini memerlukan dua parameter:
tempat penelusuran, dan kueri penelusuran.
Karena fungsi SEARCH
memiliki aturan khusus tentang cara penelusuran data, sebaiknya baca dokumentasi SEARCH
.
Kueri berikut hanya mempertahankan baris yang memiliki kolom yang sama persis dengan "35.193.12.15":
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW` AS t
WHERE
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20
Dalam kueri sebelumnya, tanda petik terbalik menggabungkan nilai yang akan ditelusuri. Hal ini
memastikan bahwa fungsi SEARCH
menelusuri kecocokan persis antara
nilai kolom dan nilai di antara tanda petik terbalik.
Jika tanda petik terbalik dihilangkan dalam string kueri, string kueri akan dibagi berdasarkan aturan yang ditentukan dalam dokumentasi SEARCH
.
Misalnya, saat pernyataan berikut dijalankan,
string kueri akan dibagi menjadi empat token: "35", "193", "12", dan "15":
SEARCH(t,"35.193.12.15")
Pernyataan SEARCH
sebelumnya cocok dengan baris jika satu kolom cocok dengan keempat token. Urutan token tidak penting.
Anda dapat menyertakan beberapa pernyataan SEARCH
dalam kueri. Misalnya, dalam
kueri sebelumnya, Anda dapat mengganti filter pada ID log dengan
pernyataan seperti berikut:
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
Pernyataan sebelumnya menelusuri setiap kolom entri log dalam tampilan log, sedangkan pernyataan asli hanya menelusuri kolom log_id
dari entri log.
Untuk melakukan beberapa penelusuran di beberapa kolom, pisahkan setiap string dengan spasi. Misalnya, pernyataan berikut cocok dengan baris yang kolomnya berisi "Hello World", "happy", dan "days":
SEARCH(t,"`Hello World` happy days")
Terakhir, Anda dapat menelusuri kolom tertentu, bukan menelusuri
seluruh tabel. Misalnya, pernyataan berikut hanya menelusuri
kolom bernama text_payload
dan json_payload
:
SEARCH((text_payload, json_payload) ,"`35.222.132.245`")
Untuk informasi tentang cara parameter fungsi SEARCH
diproses, lihat halaman referensi BigQuery Fungsi penelusuran.
Penelusuran substring
Untuk melakukan pengujian yang tidak peka huruf besar/kecil guna menentukan apakah nilai ada dalam
ekspresi, gunakan fungsi CONTAINS_SUBSTR
.
Fungsi ini menampilkan TRUE
jika nilai ada dan
FALSE
jika tidak. Nilai penelusuran harus berupa literal STRING
, tetapi bukan
literal NULL
.
Misalnya, kueri berikut mengambil semua entri log audit Akses Data dengan alamat IP tertentu yang stempel waktunya berada dalam rentang waktu tertentu. Terakhir, kueri mengurutkan hasil, lalu menampilkan 20 hasil terlama:
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW` AS t
WHERE
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
CONTAINS_SUBSTR(t,"35.193.12.15")
ORDER BY timestamp ASC
LIMIT 20
Kueri sebelumnya melakukan pengujian substring. Oleh karena itu, baris yang berisi
"35.193.12.152" cocok dengan pernyataan CONTAINS_SUBSTR
.
Menggabungkan data dari beberapa sumber
Pernyataan kueri memindai satu atau beberapa tabel atau ekspresi dan menampilkan
baris hasil yang dihitung. Misalnya, Anda dapat menggunakan pernyataan kueri untuk menggabungkan
hasil pernyataan SELECT
pada tabel atau set data yang berbeda dengan
berbagai cara, lalu memilih kolom dari data gabungan.
Menggabungkan data dari dua tabel dengan join
Untuk menggabungkan informasi dari dua tabel, gunakan salah satu operator join. Jenis join dan klausa bersyarat yang Anda gunakan menentukan cara baris digabungkan dan dihapus.
Kueri berikut memberi Anda kolom json_payload
dari baris dalam
dua tabel berbeda yang ditulis oleh span rekaman aktivitas yang sama. Kueri ini menjalankan
JOIN
bagian dalam di atas dua tabel untuk baris dengan nilai
kolom span_id
dan trace
di kedua tabel yang cocok. Dari hasil ini,
kueri kemudian memilih kolom timestamp
, severity
, dan json_payload
yang berasal dari TABLE_NAME_OF_LOG_VIEW_1, kolom json_payload
dari
TABLE_NAME_OF_LOG_VIEW_2, dan nilai kolom span_id
dan trace
tempat kedua tabel digabungkan, dan menampilkan hingga 100
baris:
SELECT
a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM `TABLE_NAME_OF_LOG_VIEW_1` a
JOIN `TABLE_NAME_OF_LOG_VIEW_2` b
ON
a.span_id = b.span_id AND
a.trace = b.trace
LIMIT 100
Menggabungkan beberapa pilihan dengan gabungan
Untuk menggabungkan hasil dari dua pernyataan SELECT
atau lebih dan menghapus
baris duplikat, gunakan operator UNION
. Untuk mempertahankan baris
duplikasi, gunakan operator UNION ALL
.
Kueri berikut membaca data satu jam terakhir dari TABLE_NAME_OF_LOG_VIEW_1, menggabungkan hasilnya dengan data satu jam terakhir dari TABLE_NAME_OF_LOG_VIEW_2, mengurutkan data gabungan dengan meningkatkan stempel waktu, lalu menampilkan 100 entri terlama:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM(
SELECT * FROM `TABLE_NAME_OF_LOG_VIEW_1`
UNION ALL
SELECT * FROM `TABLE_NAME_OF_LOG_VIEW_2`
)
ORDER BY timestamp ASC
LIMIT 100
Menghapus entri log duplikat
Log Analytics tidak menghapus entri log duplikat sebelum kueri dijalankan. Perilaku ini berbeda dengan saat Anda mengkueri entri log menggunakan Logs Explorer, yang menghapus entri duplikat dengan membandingkan nama log, stempel waktu, dan kolom ID sisipan.
Anda dapat menggunakan validasi tingkat baris untuk menghapus entri log duplikat.
Untuk mengetahui informasi selengkapnya, lihat Memecahkan masalah: Ada entri log duplikat di hasil Log Analytics saya.
Batasan
Kueri yang digunakan di halaman Log Analytics mendukung fungsi GoogleSQL dengan beberapa pengecualian.
Perintah SQL berikut tidak didukung untuk kueri SQL yang dikeluarkan menggunakan halaman Log Analytics:
- Perintah DDL dan DML
- Fungsi yang ditentukan pengguna JavaScript
- Fungsi BigQuery ML
- Variabel SQL
Hal berikut hanya didukung saat Anda mengkueri set data tertaut menggunakan halaman BigQuery Studio dan Looker Studio, serta alat command line bq:
- Fungsi yang ditentukan pengguna JavaScript
- Fungsi BigQuery ML
- Variabel SQL
Langkah selanjutnya
Untuk informasi tentang cara merutekan dan menyimpan entri log, lihat dokumen berikut:
- Membuat bucket log
- Mengupgrade bucket untuk menggunakan Log Analytics
- Menautkan bucket log ke set data BigQuery
- Mengonfigurasi dan mengelola sink
Untuk dokumentasi referensi SQL, lihat dokumen berikut: