Contoh kueri SQL

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:

  1. Di konsol Google Cloud, buka halaman Logs Storage:

    Buka Penyimpanan Log

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

  2. 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.

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:

  1. Di konsol Google Cloud, buka halaman Log Analytics:

    Buka Log Analytics

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

  2. 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.

Bagian ini menjelaskan dua pendekatan berbeda yang dapat Anda gunakan untuk menelusuri beberapa kolom tabel.

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.

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:

Untuk dokumentasi referensi SQL, lihat dokumen berikut: