Audit-Logeinträge aufteilen

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 Index 0. split.index wird auch an das Feld LogEntry.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 und protoPayload.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:

  1. Sortieren Sie die aufgeteilten Audit-Logs in aufsteigender Reihenfolge nach LogEntry.split.index.

  2. Erstellen Sie eine Kopie des ersten aufgeteilten Logs. Dabei gilt: LogEntry.split.index == 0. Diese Kopie ist der Anfang des wieder zusammengestellten Protokolls.

  3. 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:

    1. Wenn das Feld bereits im neu zusammengestellten Log vorhanden ist, hängen Sie den Inhalt dieses Felds an das wiederhergestellte Log an.

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

  4. Löschen Sie nach dem Durchlaufen der aufgeteilten Felder LogEntry.split des wieder zusammengestellten Logs.

  5. Entfernen Sie das .0-Suffix aus dem LogEntry.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"},
      ]
    }
  }
}