SQL-Beispielabfragen

Dieses Dokument enthält Beispielabfragen für Logeinträge, die in Log-Buckets gespeichert sind, für die ein Upgrade zur Verwendung von Loganalysen durchgeführt wurde. Für diese Buckets können Sie SQL-Abfragen auf der Seite Log Analytics in der Google Cloud Console ausführen. Weitere Beispiele finden Sie in den GitHub-Repositories logging-analytics-samples und security-analytics.

In diesem Dokument wird nicht beschrieben, wie Sie SQL verwenden oder Logeinträge weiterleiten und speichern. Informationen zu diesen Themen finden Sie im Abschnitt Weitere Informationen.

In den Beispielen auf dieser Seite werden Logansichten abgefragt. Wenn Sie eine Analytics-Ansicht abfragen möchten, verwenden Sie das folgende Pfadformat: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. Im vorherigen Ausdruck ist PROJECT_ID die ID Ihres Projekts und LOCATION und ANALYTICS_VIEW_ID sind der Standort und der Name Ihrer Analyseansicht.

Unterstützung von SQL-Sprachen

In Abfragen, die auf der Seite Loganalysen verwendet werden, werden GoogleSQL-Funktionen mit einigen Ausnahmen unterstützt.

Die folgenden SQL-Befehle werden für SQL-Abfragen, die über die Seite Loganalysen ausgegeben werden, nicht unterstützt:

  • DDL- und DML-Befehle
  • Benutzerdefinierte JavaScript-Funktionen
  • BigQuery ML-Funktionen
  • SQL-Variablen

Die folgenden Elemente werden nur unterstützt, wenn Sie ein verknüpftes Dataset über die Seiten BigQuery Studio und Looker Studio oder über das bq-Befehlszeilentool abfragen:

  • Benutzerdefinierte JavaScript-Funktionen
  • BigQuery ML-Funktionen
  • SQL-Variablen

Best Practices

Wir empfehlen, den Zeitraum für Ihre Abfrage über die Zeitraumauswahl festzulegen. Wenn Sie beispielsweise die Daten der letzten Woche aufrufen möchten, wählen Sie in der Zeitbereichsauswahl Letzte 7 Tage aus. Sie können auch die Zeitraumauswahl verwenden, um eine Start- und Endzeit festzulegen, eine Uhrzeit anzugeben, um die herum Sie sich die Daten ansehen möchten, und Zeitzonen zu ändern.

Wenn Sie ein timestamp-Feld in die WHERE-Klausel einfügen, wird die Einstellung für die Zeitbereichsauswahl nicht verwendet. Das folgende Beispiel zeigt, wie Sie nach Zeitstempel filtern:

-- Matches log entries whose timestamp is within the most recent 1 hour.
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Weitere Informationen zum Filtern nach Zeit finden Sie unter Zeitfunktionen und Zeitstempelfunktionen.

Hinweise

In diesem Abschnitt werden die Schritte beschrieben, die Sie ausführen müssen, bevor Sie Log Analytics verwenden können.

Log-Buckets konfigurieren

Prüfen Sie, ob für Ihre Log-Buckets ein Upgrade zur Verwendung von Log Analytics durchgeführt wurde:

  1. Rufen Sie in der Google Cloud Console die Seite Logspeicher auf:

    Zum Log-Speicher

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.

  2. Prüfen Sie für jeden Log-Bucket, der eine Logansicht enthält, die Sie abfragen möchten, ob in der Spalte Loganalysen verfügbar die Option Öffnen angezeigt wird. Wenn Upgrade durchführen angezeigt wird, klicken Sie darauf und schließen Sie das Dialogfeld ab.

IAM-Rollen und ‑Berechtigungen konfigurieren

In diesem Abschnitt werden die IAM-Rollen oder Berechtigungen beschrieben, die für die Verwendung von Log Analytics erforderlich sind:

  • Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zur Verwendung von Log Analytics und zum Abfragen von Log-Ansichten benötigen:

    Sie können ein Hauptkonto auf eine bestimmte Logansicht beschränken, indem Sie entweder eine IAM-Bedingung für die auf Projektebene erteilte Rolle „Logs View Accessor“ hinzufügen oder eine IAM-Bindung zur Richtliniendatei der Logansicht hinzufügen. Weitere Informationen finden Sie unter Zugriff auf eine Logansicht steuern.

    Dies sind dieselben Berechtigungen, die Sie benötigen, um Logeinträge auf der Seite Log-Explorer aufzurufen. Informationen zu zusätzlichen Rollen, die Sie zum Abfragen von Ansichten in benutzerdefinierten Buckets oder zum Abfragen der _AllLogs-Ansicht des _Default-Logbuckets benötigen, finden Sie unter Cloud Logging-Rollen.

  • Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Observability Analytics User (roles/observability.analyticsUser) für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Abfragen von Analyseansichten benötigen.

Abfragen auf dieser Seite verwenden

  1. Rufen Sie in der Google Cloud Console die Seite Log Analytics auf:

    Zu Log Analytics

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.

  2. Klicken Sie im Bereich Abfrage auf  SQL und kopieren Sie dann eine Abfrage in den Bereich „SQL-Abfrage“.

    Bevor Sie eine Abfrage kopieren, ersetzen Sie in der FROM-Klausel die folgenden Felder:

    • PROJECT_ID: Die Kennung des Projekts.
    • LOCATION: Der Speicherort der Logansicht oder der Analyseansicht.
    • BUCKET_ID: Der Name oder die ID des Log-Buckets.
    • LOG_VIEW_ID: Die Kennung der Logansicht. Sie ist auf 100 Zeichen begrenzt und darf nur Buchstaben, Ziffern, Unterstriche und Bindestriche enthalten.

    Im Folgenden sehen Sie das Format der FROM-Klausel für eine Log-Ansicht:

    FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
    

    Die Logbeispiele auf dieser Seite fragen eine Logansicht ab. Wenn Sie eine Analytics-Ansicht abfragen möchten, verwenden Sie das folgende Pfadformat: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. Im vorherigen Ausdruck ist PROJECT_ID die ID Ihres Projekts und LOCATION und ANALYTICS_VIEW_ID sind der Standort und der Name Ihrer Analyseansicht.

Wenn Sie die in diesem Dokument gezeigten Abfragen auf der Seite BigQuery Studio verwenden oder das bq-Befehlszeilentool nutzen möchten, bearbeiten Sie die FROM-Klausel und geben Sie den Pfad zum verknüpften Dataset ein. Wenn Sie beispielsweise die Ansicht _AllLogs für das verknüpfte Dataset mit dem Namen mydataset im Projekt myproject abfragen möchten, lautet der Pfad myproject.mydataset._AllLogs.

Gängige Anwendungsfälle

In diesem Abschnitt werden einige gängige Anwendungsfälle aufgeführt, die Ihnen bei der Erstellung Ihrer benutzerdefinierten Abfragen helfen können.

Logeinträge im Standard-Log-Bucket anzeigen

Führen Sie die folgende Abfrage aus, um den _Default-Bucket abzufragen:

SELECT
  timestamp, severity, resource.type, log_name, text_payload, proto_payload, json_payload
FROM
  `PROJECT_ID.LOCATION._Default._AllLogs`
-- Limit to 1000 entries
LIMIT 1000

Feldwert mit regulärem Ausdruck extrahieren

Wenn Sie einen Wert aus einem String mithilfe eines regulären Ausdrucks extrahieren möchten, verwenden Sie die Funktion REGEXP_EXTRACT:

SELECT
  -- Display the timestamp, and the part of the name that begins with test.
  timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Get the value of jobName, which is a subfield in a JSON structure.
  JSON_VALUE(json_payload.jobName) IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20

Weitere Informationen finden Sie in der Dokumentation zu REGEXP_EXTRACT.

Bei Teilstring-Übereinstimmungen wie in der vorherigen Abfrage führt die Verwendung der Funktion CONTAINS_SUBSTR zu einer effizienteren Abfrage.

Log-Einträge filtern

Wenn Sie einen Filter auf Ihre Abfrage anwenden möchten, fügen Sie eine WHERE-Klausel hinzu. Die Syntax, die Sie in dieser Klausel verwenden, hängt vom Datentyp des Felds ab. Dieser Abschnitt enthält mehrere Beispiele für verschiedene Datentypen.

Logeinträge nach Nutzlasttyp filtern

Logeinträge können einen von drei Nutzlasttypen haben. Verwenden Sie eine der folgenden Klauseln, um Logeinträge nach dem Nutzlasttyp zu filtern:

  • Textnutzlasten

    -- Matches log entries that have a text payload.
    WHERE text_payload IS NOT NULL
    
  • JSON-Nutzlasten

    -- Matches log entries that have a JSON payload.
    WHERE json_payload IS NOT NULL
    
  • Proto-Nutzlasten

    -- Matches log entries that have a proto payload.
    -- Because proto_payload has a data type of RECORD, this statement tests
    -- whether a mandatory subfield exits.
    WHERE proto_payload.type IS NOT NULL
    

In den Abfrageergebnissen werden sowohl die Felder json_payload als auch proto_payload in JSON gerendert, durch die Sie navigieren können.

Protokolldaten nach Zeitstempel filtern

Wenn Sie Logeinträge nach ihrem Zeitstempel filtern möchten, empfehlen wir die Verwendung der Zeitbereichsauswahl. Sie können timestamp aber auch in der WHERE-Klausel angeben:

-- Matches log entries whose timestamp is within the most recent hour
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Weitere Informationen zum Filtern nach Zeit finden Sie unter Zeitfunktionen und Zeitstempelfunktionen.

Nach Ressource filtern

Wenn Sie Ihre Logdaten nach Ressource filtern möchten, fügen Sie der WHERE-Klausel eine resource.type-Anweisung hinzu:

-- Matches log entries whose resource type is gce_instance
WHERE resource.type = "gce_instance"

Nach Schweregrad filtern

Wenn Sie Ihre Protokolldaten nach einem Schweregrad filtern möchten, fügen Sie der WHERE-Klausel eine severity-Anweisung hinzu:

-- Matches log entries whose severity is INFO or ERROR
WHERE severity IS NOT NULL AND severity IN ('INFO', 'ERROR')

Sie können Ihre Logeinträge auch nach severity_number filtern. Dabei handelt es sich um eine Ganzzahl. Die folgende Klausel entspricht beispielsweise allen Logeinträgen, deren Wichtigkeitsstufe mindestens NOTICE ist:

-- Matches log entries whose severity level is at least NOTICE
WHERE severity_number IS NOT NULL AND severity_number > 200

Informationen zu den aufgezählten Werten finden Sie unter LogSeverity.

Nach Logname filtern

Wenn Sie Ihre Protokolldaten nach einem Protokollnamen filtern möchten, fügen Sie der WHERE-Klausel eine log_name- oder log_id-Anweisung hinzu:

  • Der Logname gibt den Ressourcenpfad an:

    -- Matches log entries that have the following log ID.
    WHERE log_name="projects/cloud-logs-test-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  • Die Log-ID enthält nicht den Ressourcenpfad:

    -- Matches log entries that have the following log id.
    WHERE log_id = "cloudaudit.googleapis.com/data_access"
    

Logeinträge nach Ressourcenlabel filtern

Ressourcenlabels werden als JSON-Struktur gespeichert. Wenn Sie nach dem Wert eines Felds in einer JSON-Struktur filtern möchten, verwenden Sie die Funktion JSON_VALUE:

SELECT
  timestamp, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries whose resource type is gce_instance and whose zone is
  -- us-central1-f. Because resource has data type JSON, you must use JSON_VALUE
  -- to get the value for subfields, like zone.
  resource.type = "gce_instance" AND
  JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC

Die vorherige Abfrage basiert auf dem Format von Ressourcenlabels, wie sie in einem Logeintrag gespeichert sind. Hier ein Beispiel für das Ressourcenfeld:

{
   type: "gce_instance"
   labels: {
      instance_id: "1234512345123451"
      project_id: "my-project"
      zone: "us-central1-f"
   }
}

Informationen zu allen Funktionen, mit denen JSON-Daten abgerufen und transformiert werden können, finden Sie unter JSON-Funktionen.

Nach HTTP-Anfrage filtern

Wenn Sie nur Logeinträge abfragen möchten, die ein HTTP-Anfragefeld haben, verwenden Sie die folgende Klausel:

-- Matches log entries that have a HTTP request_method field.
-- Don't compare http_request to NULL. This field has a data type of RECORD.
WHERE http_request.request_method IS NOT NULL

Sie können auch die IN-Anweisung verwenden:

-- Matches log entries whose HTTP request_method is GET or POST.
WHERE http_request.request_method IN ('GET', 'POST')

Nach HTTP-Status filtern

Wenn Sie nur Logeinträge mit einem HTTP-Status abfragen möchten, verwenden Sie die folgende Klausel:

-- Matches log entries that have an http_request.status field.
WHERE http_request.status IS NOT NULL

Nach einem Feld in einem JSON-Datentyp filtern

Wenn Sie nur Logeinträge abfragen möchten, in denen das Unterfeld eines Felds mit einem JSON-Datentyp einen bestimmten Wert hat, extrahieren Sie den Wert mit der Funktion JSON_VALUE:

-- Compare the value of the status field to NULL.
WHERE JSON_VALUE(json_payload.status) IS NOT NULL

Die vorherige Klausel unterscheidet sich geringfügig von der folgenden Klausel:

-- Compare the status field to NULL.
WHERE json_payload.status IS NOT NULL

In der ersten Klausel wird geprüft, ob der Wert des Statusfelds NULL ist. In der zweiten Klausel wird geprüft, ob das Statusfeld vorhanden ist. Angenommen, eine Logansicht enthält zwei Logeinträge. Für einen Logeintrag hat das Feld json_payload das folgende Format:

{
    status: {
        measureTime: "1661517845"
    }
}

Für den anderen Logeintrag hat das Feld json_payload eine andere Struktur:

{
    @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"
}

Die Klausel WHERE json_payload.status IS NOT NULL stimmt mit beiden Logeinträgen überein. Die Klausel WHERE JSON_VALUE(json_payload.status) IS NOT NULL stimmt jedoch nur mit dem zweiten Logeintrag überein.

Logeinträge gruppieren und zusammenfassen

In diesem Abschnitt wird auf den vorherigen Beispielen aufgebaut und veranschaulicht, wie Sie Logeinträge gruppieren und aggregieren können. Wenn Sie keine Gruppierung, aber eine Aggregation angeben, wird ein Ergebnis ausgegeben, da in SQL alle Zeilen, die die WHERE-Klausel erfüllen, als eine Gruppe behandelt werden.

Jeder SELECT-Ausdruck muss in den Gruppenfeldern enthalten oder aggregiert werden.

Logeinträge nach Zeitstempel gruppieren

Wenn Sie Daten nach Zeitstempel gruppieren möchten, verwenden Sie die Funktion TIMESTAMP_TRUNC, mit der ein Zeitstempel auf eine bestimmte Granularität wie HOUR gekürzt wird:

SELECT
  -- Truncate the timestamp by hour.
  TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
  JSON_VALUE(json_payload.status) AS status,
  -- Count the number log entries in each group.
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries that have a status field whose value isn't NULL.
  json_payload IS NOT NULL AND JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY
  -- Group by hour and status
  hour,status
ORDER BY hour ASC

Weitere Informationen finden Sie in der Dokumentation zu TIMESTAMP_TRUNC und unter Datums- und Zeitfunktionen.

Logeinträge nach Ressource gruppieren

In der folgenden Abfrage wird gezeigt, wie Logeinträge nach Ressourcentyp gruppiert und dann die Anzahl der Logeinträge in jeder Gruppe gezählt wird:

SELECT
   -- Count the number of log entries for each resource type
   resource.type, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY resource.type
LIMIT 100

Logeinträge nach Schweregrad gruppieren

Die folgende Abfrage zeigt, wie Logeinträge nach Schweregrad gruppiert und dann die Anzahl der Logeinträge in jeder Gruppe gezählt wird:

SELECT
  -- Count the number of log entries for each severity.
  severity, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100

Logeinträge nach log_id gruppieren

In der folgenden Abfrage wird gezeigt, wie Logeinträge nach der Log-ID gruppiert und dann die Anzahl der Logeinträge in jeder Gruppe gezählt wird:

SELECT
  -- Count the number of log entries for each log ID.
  log_id, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100

Durchschnittliche Latenz von HTTP-Anfragen pro URL berechnen

Die folgende Abfrage veranschaulicht, wie Logeinträge nach der HTTP-Anfrage-URL und dem Standort gruppiert und dann die Anzahl der Logeinträge in jeder Gruppe gezählt wird:

SELECT
  -- Compute the average latency for each group. Because the labels field has a
  -- data type of JSON, use JSON_VALUE to get the value of checker_location.
  JSON_VALUE(labels.checker_location) AS location,
  AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries when the request_method field is GET.
  http_request IS NOT NULL AND http_request.request_method IN ('GET')
GROUP BY
  -- Group by request URL and location
  http_request.request_url, location
ORDER BY location
LIMIT 100

Durchschnittliche Anzahl der gesendeten Byte für einen Subnetzwerktest berechnen

In der folgenden Abfrage wird gezeigt, wie Logeinträge nach dem in den Ressourcenlabels angegebenen Standort gruppiert und dann die Anzahl der Logeinträge in jeder Gruppe berechnet wird:

SELECT
  -- Compute the average number of bytes sent per location. Because labels has
  -- a data type of JSON, use JSON_VALUE to get the value of the location field.
  -- bytes_sent is a string. Must cast to a FLOAT64 before computing average.
  JSON_VALUE(resource.labels.location) AS location,
  AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  resource.type = "gce_subnetwork" AND json_payload IS NOT NULL
GROUP BY
  -- Group by location
  location
LIMIT 100

Weitere Informationen finden Sie unter JSON-Funktionen und Konversionsfunktionen.

Logeinträge mit einem Feld zählen, das einem Muster entspricht

Wenn Sie den Teilstring zurückgeben möchten, der mit einem regulären Ausdruck übereinstimmt, verwenden Sie die Funktion REGEXP_EXTRACT:

SELECT
  -- Extract the value that begins with test.
  -- Count the number of log entries for each name.
  REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20

Weitere Beispiele finden Sie in der Dokumentation zu REGEXP_EXTRACT.

In diesem Abschnitt werden zwei Ansätze beschrieben, mit denen Sie mehrere Spalten der Ansicht durchsuchen können, die Sie abfragen:

  • Tokenbasierte Suche: Sie geben den Suchort und eine Suchanfrage an und verwenden dann die Funktion SEARCH. Da für die Funktion SEARCH bestimmte Regeln für die Suche in den Daten gelten, empfehlen wir Ihnen, die SEARCH-Dokumentation zu lesen.

  • Teilstringbasierte Suche: Sie geben den Suchort und ein String-Literal an und verwenden dann die Funktion CONTAINS_SUBSTR. Das System führt einen Test durch, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird, um festzustellen, ob das Stringliteral in einem Ausdruck vorhanden ist. Die Funktion CONTAINS_SUBSTR gibt TRUE zurück, wenn das Stringliteral vorhanden ist, und andernfalls FALSE. Der Suchwert muss ein STRING-Literal sein, aber nicht das Literal NULL.

In der folgenden Abfrage werden nur die Zeilen beibehalten, die ein Feld enthalten, das genau mit „35.193.12.15“ übereinstimmt:

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
  -- Search data access audit logs for the IP address that matches 35.193.12.15.
  -- The use of backticks prevents the string from being tokenized.
  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

Wenn im Abfragestring keine Backticks verwendet werden, wird er anhand der in der SEARCH-Dokumentation definierten Regeln aufgeteilt. Wenn beispielsweise die folgende Anweisung ausgeführt wird, wird der Abfragestring in vier Tokens aufgeteilt: „35“, „193“, „12“ und „15“:

  SEARCH(t,"35.193.12.15")

Die vorherige SEARCH-Anweisung stimmt mit einer Zeile überein, wenn ein einzelnes Feld mit allen vier Tokens übereinstimmt. Die Reihenfolge der Tokens spielt keine Rolle.

Eine Abfrage kann mehrere SEARCH-Anweisungen enthalten. In der vorherigen Abfrage können Sie beispielsweise den Filter für die Log-ID durch eine Anweisung wie die folgende ersetzen:

  SEARCH(t,"`cloudaudit.googleapis.com/data_access`")

Mit der vorherigen Anweisung wird jedes Feld der Logeinträge in der Logansicht durchsucht, während mit der ursprünglichen Anweisung nur das Feld log_id der Logeinträge durchsucht wird.

Wenn Sie mehrere Suchvorgänge für mehrere Felder ausführen möchten, trennen Sie die einzelnen Strings durch ein Leerzeichen. Die folgende Anweisung entspricht beispielsweise Zeilen, in denen ein Feld „Hello World“, „happy“ und „days“ enthält:

  SEARCH(t,"`Hello World` happy days")

Außerdem können Sie in bestimmten Feldern suchen, anstatt eine ganze Tabelle zu durchsuchen. Mit der folgenden Anweisung werden beispielsweise nur die Spalten mit den Namen text_payload und json_payload durchsucht:

   SEARCH((text_payload, json_payload) ,"`35.222.132.245`")

Informationen zur Verarbeitung der Parameter der SEARCH-Funktion finden Sie auf der BigQuery-Referenzseite Suchfunktionen.

Mit der folgenden Abfrage werden beispielsweise alle Audit-Logeinträge zum Datenzugriff mit einer bestimmten IP-Adresse abgerufen, deren Zeitstempel in einem bestimmten Zeitraum liegen. Schließlich werden die Ergebnisse sortiert und die 20 ältesten Ergebnisse angezeigt:

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
  -- Search data access audit logs for the IP address that matches 35.193.12.15.
  -- CONTAINS_SUBSTR performs a contains-test.
  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

Mehrere Ansichten abfragen

Abfrageanweisungen durchsuchen eine oder mehrere Tabellen oder Ausdrücke und geben die berechneten Ergebniszeilen zurück. Sie können beispielsweise Abfrageanweisungen verwenden, um die Ergebnisse von SELECT-Anweisungen für verschiedene Tabellen oder Datasets auf unterschiedliche Weise zusammenzuführen und dann die Spalten aus den kombinierten Daten auszuwählen.

Wenn Sie mehrere Ansichten abfragen, müssen sich diese am selben Speicherort befinden. Wenn sich beispielsweise zwei Ansichten am Speicherort us-east1 befinden, können Sie beide Ansichten mit einer einzigen Abfrage abfragen. Sie können auch zwei Ansichten abfragen, die sich in der Multiregion us befinden. Wenn der Standort einer Ansicht jedoch global ist, kann sich diese Ansicht an einem beliebigen physischen Standort befinden. Daher können Joins zwischen zwei Ansichten mit dem Standort global fehlschlagen.

Zwei Logansichten über die Trace-ID zusammenführen

Wenn Sie Informationen aus zwei Tabellen kombinieren möchten, verwenden Sie einen der Join-Operatoren:

SELECT
  -- Do an inner join on two tables by using the span ID and trace ID.
  -- Don't join only by span ID, as this field isn't globally unique.
  -- From the first view, show the timestamp, severity, and JSON payload.
  -- From the second view, show the JSON payload.
  a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1` a
JOIN  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2` b
ON
  a.span_id = b.span_id AND
  a.trace = b.trace
LIMIT 100

Zwei Logansichten mit einer UNION-Anweisung abfragen

Wenn Sie die Ergebnisse von zwei oder mehr SELECT-Anweisungen kombinieren und doppelte Zeilen verwerfen möchten, verwenden Sie den Operator UNION. Wenn Sie doppelte Zeilen beibehalten möchten, verwenden Sie den Operator UNION ALL:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
-- Create a union of two log views
FROM(
  SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1`
  UNION ALL
  SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2`
)
-- Sort the union by timestamp.
ORDER BY timestamp ASC
LIMIT 100

Doppelte Logeinträge entfernen

In Log Analytics werden doppelte Logeinträge nicht entfernt, bevor eine Abfrage ausgeführt wird. Dieses Verhalten unterscheidet sich von dem, wenn Sie Logeinträge mit dem Log-Explorer abfragen. Dort werden doppelte Einträge entfernt, indem die Felder für Lognamen, Zeitstempel und Einfüge-ID verglichen werden.

Mit der Validierung auf Zeilenebene können Sie doppelte Logeinträge entfernen.

Weitere Informationen finden Sie unter Fehlerbehebung: In meinen Loganalysen-Ergebnissen sind doppelte Logeinträge vorhanden.

Nächste Schritte

Informationen zum Weiterleiten und Speichern von Logeinträgen finden Sie in den folgenden Dokumenten:

SQL-Referenzdokumentation finden Sie in den folgenden Dokumenten: