Dokumen ini menjelaskan cara Cloud Logging membagi entri log audit berukuran besar dan memberikan panduan tentang cara menyusun ulang log audit terpisah ini.
Jika satu entri log audit melebihi batas ukuran, Cloud Logging akan membagi entri tersebut dan mendistribusikan data yang terdapat dalam entri log audit asli ke beberapa entri. Pengguna mungkin ingin menyusun ulang log audit terpisah karena setiap entri log terpisah tidak berisi semua kolom dari log audit asli.
Mengenali entri log audit terpisah
Entri log terpisah berisi informasi tentang entri asli tempat entri tersebut dipisahkan. Jika entri log berisi kolom
split
, entri tersebut
adalah hasil dari pembagian entri log asli yang lebih besar. Kolom split
adalah objek LogSplit
yang berisi informasi yang diperlukan untuk mengidentifikasi entri log terpisah
yang terkait.
Setiap entri log terpisah berisi kolom berikut:
split.uid
: ID unik untuk grup entri log yang dipisahkan dari entri log asli yang umum. Nilai kolom ini sama untuk semua entri yang dipisahkan dari entri log asli.split.index
: posisi entri ini dalam rangkaian entri pemisahan. Entri pertama dari pemisahan memiliki indeks0
.split.index
juga ditambahkan ke kolomLogEntry.insertId
.split.totalSplits
: jumlah entri log yang dibagi menjadi entri log asli. Nilai kolom ini sama untuk semua entri yang dipisahkan dari entri log asli.
Cara pemisahan entri log
Jika entri log audit yang berukuran besar dibagi, kolom ini akan didistribusikan ke seluruh entri log terpisah yang dihasilkan sebagai berikut:
Semua kolom kecuali kolom
protoPayload
diduplikasi ke setiap entri terpisah.Subkolom
protoPayload
berikut dapat dipisahkan menjadi beberapa entri:protoPayload.metadata
protoPayload.request
protoPayload.response
Semua subkolom
protoPayload
lainnya disertakan di semua entri pemisahan.Untuk subkolom
protoPayload.metadata
,protoPayload.request
, danprotoPayload.response
, jenis kolom berikut dapat dibagi ke beberapa entri:
Jika suatu kolom adalah anggota kolom yang dapat dibagi, tetapi bukan salah satu jenis kolom yang dapat dipisahkan, kolom tersebut hanya ada di salah satu log terpisah.
Misalnya, kolom boolean di subkolom protoPayload.request
hanya dapat
muncul dalam satu entri log terpisah, tetapi kolom string di subkolom protoPayload.request
dapat membagi kontennya ke beberapa entri log terpisah.
Untuk mengetahui contoh pembagian entri lama, lihat Contoh pemisahan entri log.
Kolom berulang dengan banyak nilai
Jika nilai kolom protoPayload.metadata
, protoPayload.request
, atau
protoPayload.response
berisi daftar nilai berulang, daftar tersebut mungkin
akan dipecah dan didistribusikan ke beberapa entri log terpisah.
Misalnya, daftar nilai ["foo", "bar", "baz"] dapat dibagi menjadi 2
daftar: ["foo", "ba"] dan ["", "r", "baz"]. Daftar pertama adalah entri dengan
split.index
dari 0
, dan daftar kedua adalah entri dengan split.index
dari
1
. Daftar kedua dimulai dengan string kosong untuk mempertahankan posisi
elemen dalam daftar dan untuk menunjukkan bahwa elemen dalam posisi yang sama dalam
daftar yang berbeda harus digabungkan. Dalam contoh, ba
adalah elemen daftar
kedua dalam entri 0
, dan r
adalah elemen daftar kedua dalam entri 1
sehingga
digabungkan kembali dalam urutan bar
saat menyusun ulang daftar asli.
Kolom besar dan tidak berulang
Jika kolom Struct
dan string
yang besar dan tidak berulang dibagi, kolom ini
akan ditangani sebagai berikut:
Kolom
string
dibagi pada tingkat karakter dan bukan pada tingkat byte. Jadi, karakter multi-byte tidak diubah.LogEntry.split.index
mengontrol urutan konten pemisahan, kolom yang tidak berulang.
Menyusun ulang entri log terpisah
Untuk menyusun ulang kumpulan log terpisah, selesaikan langkah-langkah berikut:
Urutkan kumpulan log audit terpisah berdasarkan
LogEntry.split.index
dalam urutan menaik.Buat salinan log terpisah pertama, dengan
LogEntry.split.index == 0
. Salinan ini adalah awal dari log yang disusun ulang.Untuk entri log yang tersisa, lakukan iterasi melalui semua kolom
protoPayload
yang dapat dipisahkan dan selesaikan langkah-langkah berikut untuk setiap kolom:Jika kolom sudah ada di log yang disusun ulang, tambahkan konten kolom tersebut ke log yang disusun ulang.
Jika kolom tidak ada di log yang disusun ulang, salin kolom tersebut ke log yang telah disusun ulang
Saat dipisahkan, kolom berulang mempertahankan indeks elemennya, sehingga Anda dapat menerapkan langkah-langkah ini pada tingkat elemen saat menyusun ulang kolom berulang.
Setelah melakukan iterasi melalui kolom yang dapat dipisahkan, hapus
LogEntry.split
dari log yang disusun ulang.Hapus akhiran
.0
dariLogEntry.insert_id
log yang disusun ulang.
Sampel kueri
Untuk menemukan semua entri log yang dipisahkan dari entri log asli yang sama, jalankan kueri berikut di Logs Explorer, dengan mengganti variabel UID dengan nilai yang diinginkan:
split.uid="UID"
Contoh:
split.uid="abc123"
Untuk menemukan semua entri log yang merupakan bagian dari bagian apa pun, jalankan kueri berikut:
split:*
Memfilter log audit terpisah
Anda dapat mengecualikan semua log audit terpisah dari kueri dengan menggunakan filter berikut:
split.totalSplits = 0
Anda juga dapat menyertakan hanya entri pertama log audit terpisah dan mengecualikan entri lainnya menggunakan filter berikut:
split.index = 0
Contoh pemisahan entri log
Contoh berikut menunjukkan entri log audit sebelum dibagi menjadi empat entri log baru. Entri baru menunjukkan cara berbagai kolom ditangani dalam operasi pemisahan.
Entri log audit berukuran besar sebelum pemisahan
{
"insertId": "567",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
"authorizationInfo": [
{
"resource": "example.googleapis.com/projects/1234/resources/123",
"permission": "examples.get",
"granted": "true"
}
],
"request" {
"boolField": true,
"numberField": 123,
"stringField": "Very long string that needs 2 log entries.",
"structField": {
"nestedNumberField": 1337,
"nestedStringField": "Another long string that needs 2 log entries.",
},
"listField" [
{"value": "short 1"},
{"value": "Yet another long string."},
{"value": "short 2"},
{"value": "short 3"},
]
}
}
}
Entri log audit berukuran besar setelah pemisahan
Entri log asli dibagi ke dalam entri berikut. Perhatikan bahwa setiap entri
menyertakan objek split
dengan uid
dan nilai totalSplits
4
. Setiap
entri memiliki nilai split.index
0
, 1
, 2
, atau 3
, yang menunjukkan
urutan entri log terpisah.
Entri log terpisah, indeks 0
Berikut adalah entri log terpisah pertama, dengan nilai split.index
0
.
{
"insertId": "567.0",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "789+2022-02-22T12:22:22.22+05:00",
"index": 0,
"totalSplits": 4,
},
"protoPayload": {
// The following fields are included in all split entries
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": { // small size; included in all split entries
"principalEmail": "user@example_company.com"
},
// The following field is included in this split entry only.
"authorizationInfo": [
{
"resource": "spanner.googleapis.com/projects/1234/datasets/123",
"permission": "databases.read",
"granted": "true"
}
],
// The following field is split across all the split entries
"request" {
// boolField and numberField can only be in one split.
"boolField": true,
"numberField": 123,
// Split with the next LogEntry.
"stringField": "Very long string that ",
}
}
}
Pisahkan entri log, indeks 1
Berikut adalah entri log terpisah berikutnya, dengan nilai split.index
1
.
{
"insertId": "567.1",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "567+2022-02-22T12:22:22.22+05:00",
"index": 1,
"totalSplits": 4,
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
"request" {
// boolField and numberField aren't present
// Continued from the previous entry.
"stringField": "needs 2 log entries.",
"structField": {
"nestedNumberField": 1337,
// Split with the next LogEntry.
"nestedStringField": "Another long string ",
}
}
}
}
Entri log terpisah, indeks 2
Berikut adalah entri log terpisah berikutnya, dengan nilai split.index
2
.
{
"insertId": "567.2",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "567+2022-02-22T12:22:22.22+05:00",
"index": 2,
"totalSplits": 4,
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
request {
"structField": {
// Continued from the previous entry.
"nestedStringField": "that needs 2 log entries.",
}
"listField" [
{"value": "short 1"},
{"value": "Yet another "}, // Split with the next LogEntry.
// Missing two values, split with the next LogEntry.
]
}
}
}
Entri log terpisah, indeks 3
Berikut adalah entri log pemisahan akhir, dengan nilai split.index
3
.
{
"insertId": "567.3",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "567+2022-02-22T12:22:22.22+05:00",
"index": 3,
"totalSplits": 4,
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
"request" {
"listField" [
{}, // Padding to ensure correct positioning of elements in split repeated fields.
{"value": "long string."}, // Continuation of the second repeated field.
{"value": "short 2"},
{"value": "short 3"},
]
}
}
}