In diesem Dokument wird beschrieben, wie Cloud Logging übergroße Audit-Logeinträge aufteilt. Außerdem erhalten Sie eine Anleitung dazu, wie Sie diese aufgeteilten Audit-Logs wieder zusammensetzen.
Wenn ein einzelner Audit-Logeintrag die Größenbeschränkung überschreitet, teilt Cloud Logging diesen Eintrag auf und verteilt die im ursprünglichen Audit-Logeintrag enthaltenen Daten auf mehrere Einträge. Nutzer möchten die aufgeteilten Audit-Logs möglicherweise neu zusammenstellen, da die einzelnen Einträge der aufgeteilten Log-Einträge nicht alle Felder aus dem ursprünglichen Audit-Log enthalten.
Geteilte Audit-Logeinträge erkennen
Aufgeteilte Logeinträge enthalten Informationen über den ursprünglichen Eintrag, aus dem sie aufgeteilt wurden. Wenn ein Logeintrag das Feld split
enthält, ist der Eintrag das Ergebnis der Aufteilung eines größeren ursprünglichen Logeintrags. Das Feld split
ist ein Objekt vom Typ LogSplit
, das die Informationen enthält, die zum Identifizieren zugehöriger aufgeteilter Logeinträge erforderlich sind.
Jeder Logeintrag für die Aufteilung enthält die folgenden Felder:
split.uid
: Eine eindeutige Kennung für die Gruppe von Logeinträgen, die von einem gemeinsamen ursprünglichen Logeintrag getrennt wurden. Der Wert dieses Felds ist für alle Einträge des ursprünglichen Logeintrags gleich.split.index
: die Position dieses Eintrags in der Reihe von Aufteilungseinträgen. Der erste Eintrag aus der Aufteilung hat den Index0
.split.index
wird auch an das FeldLogEntry.insertId
angehängt.split.totalSplits
: Die Anzahl der Logeinträge, in die der ursprüngliche Logeintrag aufgeteilt wurde. Der Wert dieses Feldes ist für alle Einträge des ursprünglichen Logeintrags gleich.
Aufteilung eines Logeintrags
Wenn ein übergroßer Audit-Logeintrag aufgeteilt wird, werden die Felder wie folgt auf die resultierenden aufgeteilten Logeinträge verteilt:
Alle Felder außer dem Feld
protoPayload
werden in jeden Aufteilungseintrag dupliziert.Die folgenden
protoPayload
-Unterfelder können auf mehrere Einträge aufgeteilt werden:protoPayload.metadata
protoPayload.request
protoPayload.response
Alle anderen
protoPayload
-Unterfelder sind in allen Aufteilungseinträgen enthalten.Für die Unterfelder
protoPayload.metadata
,protoPayload.request
undprotoPayload.response
können die folgenden Feldtypen auf mehrere Einträge aufgeteilt werden:
Wenn ein Feld Mitglied eines Felds für die aufgeteilte Tabelle ist, aber keiner der Feldtypen für aufgeteilte Tabellen ist, ist es nur in einem der aufgeteilten Logs vorhanden.
Beispielsweise kann ein boolesches Feld im Unterfeld protoPayload.request
nur in einem einzigen aufgeteilten Logeintrag erscheinen. Der Inhalt eines Stringfelds im Unterfeld protoPayload.request
kann jedoch auf mehrere aufgeteilte Logeinträge aufgeteilt werden.
Ein Beispiel für die Aufteilung eines langen Eintrags finden Sie unter Beispiel für die Aufteilung eines Logeintrags.
Wiederkehrende Felder mit vielen Werten
Wenn der Wert des Felds protoPayload.metadata
, protoPayload.request
oder protoPayload.response
eine Liste wiederholter Werte enthält, kann die Liste aufgeteilt und auf mehrere aufgeteilte Logeinträge verteilt werden.
Die Liste der Werte ["foo", "bar", "baz"] kann beispielsweise in zwei Listen aufgeteilt werden: ["foo", "ba"] und ["", "r", "baz"]. Die erste Liste ist der Eintrag mit dem split.index
von 0
und die zweite Liste befindet sich im Eintrag mit split.index
von 1
. Die zweite Liste beginnt mit einem leeren String, um die Positionen der Elemente in der Liste beizubehalten und anzugeben, dass Elemente an denselben Positionen in den verschiedenen Listen miteinander verbunden werden müssen. Im Beispiel ist ba
das zweite Listenelement im Eintrag 0
und r
das zweite Listenelement im Eintrag 1
. Daher werden sie beim Zusammenstellen der ursprünglichen Liste in der Reihenfolge bar
neu kombiniert.
Große, nicht wiederkehrende Felder
Wenn große, nicht wiederkehrende Struct
- und string
-Felder aufgeteilt werden, werden diese Felder so behandelt:
Das Feld
string
wird auf Zeichenebene und nicht auf Byteebene aufgeteilt. Multibyte-Zeichen werden also nicht geändert.LogEntry.split.index
steuert die Reihenfolge der Inhalte aufgeteilter, nicht wiederholter Felder.
Geteilten Logeintrag wieder zusammensetzen
Führen Sie die folgenden Schritte aus, um einen Satz aufgeteilter Logs wieder zusammenzustellen:
Sortieren Sie die aufgeteilten Audit-Logs in aufsteigender Reihenfolge nach
LogEntry.split.index
.Erstellen Sie eine Kopie des ersten aufgeteilten Logs. Dabei gilt:
LogEntry.split.index == 0
. Diese Kopie ist der Anfang des wieder zusammengestellten Protokolls.Gehen Sie für die verbleibenden Logeinträge alle teilbaren Felder von
protoPayload
durch und führen Sie für jedes Feld die folgenden Schritte aus:Wenn das Feld bereits im neu zusammengestellten Log vorhanden ist, hängen Sie den Inhalt dieses Felds an das wiederhergestellte Log an.
Wenn das Feld nicht im neu zusammengestellten Log vorhanden ist, kopieren Sie es in das neu zusammengestellte Log.
Beim Aufteilen wird bei wiederkehrenden Feldern der Index der zugehörigen Elemente beibehalten, sodass Sie diese Schritte auf Elementebene anwenden können, wenn Sie ein wiederkehrendes Feld wieder zusammensetzen.
Löschen Sie nach dem Durchlaufen der aufgeteilten Felder
LogEntry.split
des wieder zusammengestellten Logs.Entfernen Sie das
.0
-Suffix aus demLogEntry.insert_id
des wieder zusammengesetzten Logs.
Beispielabfragen
Wenn Sie alle Logeinträge ermitteln möchten, die aus demselben ursprünglichen Logeintrag aufgeteilt wurden, führen Sie im Log-Explorer die folgende Abfrage aus. Ersetzen Sie dabei die Variable UID durch den gewünschten Wert:
split.uid="UID"
Beispiel:
split.uid="abc123"
Führen Sie die folgende Abfrage aus, um alle Logeinträge zu finden, die Teil einer Aufteilung sind:
split:*
Aufgeteilte Audit-Logs herausfiltern
Mit dem folgenden Filter können Sie alle aufgeteilten Audit-Logs aus einer Abfrage ausschließen:
split.totalSplits = 0
Mit dem folgenden Filter können Sie auch nur den ersten Eintrag eines aufgeteilten Audit-Logs einschließen und die restlichen Einträge ausschließen:
split.index = 0
Beispiel für die Aufteilung von Logeinträgen
Das folgende Beispiel zeigt einen Audit-Logeintrag, bevor er in vier neue Logeinträge aufgeteilt wird. Die neuen Einträge zeigen, wie verschiedene Felder beim Aufteilungsvorgang verarbeitet werden.
Übergroßer Audit-Logeintrag vor der Aufteilung
{
"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"},
]
}
}
}
Übergroßer Audit-Logeintrag nach der Aufteilung
Der ursprüngliche Logeintrag wird in die folgenden Einträge aufgeteilt. Jeder Eintrag enthält das Objekt split
mit einem uid
und dem totalSplits
-Wert 4
. Jeder Eintrag hat den split.index
-Wert 0
, 1
, 2
oder 3
. Damit wird die Reihenfolge der aufgeteilten Logeinträge angegeben.
Log-Eintrag aufteilen, Index 0
Dies ist der erste aufgeteilte Logeintrag mit dem split.index
-Wert 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 ",
}
}
}
Aufgeteilter Logeintrag, Index 1
Hier ist der nächste aufgeteilte Logeintrag mit dem split.index
-Wert 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 ",
}
}
}
}
Aufgeteilter Logeintrag, Index 2
Hier ist der nächste aufgeteilte Logeintrag mit dem split.index
-Wert 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.
]
}
}
}
Aufgeteilter Logeintrag, Index 3
Dies ist der endgültige Logeintrag für die Aufteilung mit einem split.index
-Wert von 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"},
]
}
}
}