Linguaggio di query di Logging

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo documento descrive, a livello generale, il linguaggio di query di Logging utilizzato per eseguire query e filtrare i dati di Cloud Logging.

Per informazioni dettagliate sulla progettazione del linguaggio di query di Logging, consulta le specifiche formali dell'API di Google per il filtro.

Per esempi di query comuni che potresti voler usare, vedi Esempi di query che utilizzano Esplora log.

Panoramica

Puoi utilizzare il linguaggio di query di Logging in Esplora log nella console Google Cloud, nell'API Logging o nell'interfaccia a riga di comando. Puoi utilizzare il linguaggio di query di Logging per eseguire query sui dati e scrivere filtri per creare sink e metriche basate su log.

Una query è un'espressione booleana che specifica un sottoinsieme di tutte le voci di log nella risorsa Google Cloud selezionata, come un progetto o una cartella Cloud.

Puoi creare query in base al campo indicizzato LogEntry utilizzando gli operatori logici AND e OR. Utilizzando il campo resource.type negli esempi seguenti, la grammatica del linguaggio di query di logging è simile alla seguente:

  • Limitazione semplice: resource.type = "gae_app"

  • Limitazione congiuntiva: resource.type = "gae_app" AND severity = ERROR

  • Limitazione disgiuntiva: resource.type = "gae_app" OR resource.type = "gce_instance"

    • In alternativa: resource.type = ("gae_app" OR "gce_instance")
  • Espressione congiuntiva/disgiuntiva complessa: resource.type = "gae_app" AND (severity = ERROR OR "error")

Di seguito è riportato un semplice esempio di query:

resource.type = "gce_instance" AND
severity >= ERROR AND
NOT textPayload:robot

Questa query corrisponde a voci di log di Compute Engine con valori di gravità almeno ERROR e il cui campo textPayload non contiene la stringa robot ovunque al suo interno. I confronti delle stringhe non sono sensibili alle maiuscole. I nomi resource, severity e textPayload sono definiti nel tipo LogEntry.

notazione della sintassi

Le seguenti sezioni forniscono una panoramica della sintassi del linguaggio di query di Logging e discutere in dettaglio come sono strutturate le query e come viene eseguita la corrispondenza. Alcuni esempi utilizzano i commenti per fornire testo esplicativo.

Tieni presente quanto segue:

  • La lunghezza di una query non può superare i 20.000 caratteri.

  • Il linguaggio di query di Logging non fa distinzione tra maiuscole e minuscole, ad eccezione delle espressioni regolari.

Riepilogo sintassi

La sintassi del linguaggio di query di Logging può essere utilizzata in termini di query e confronti.

Una query è una stringa contenente un'espressione:

expression = ["NOT"] comparison { ("AND" | "OR") ["NOT"] comparison }

Un confronto è un singolo valore o un'espressione booleana:

"The cat in the hat"
resource.type = "gae_app"

La prima riga è un esempio di confronto che è un singolo valore. Questi tipi di confronto sono limitazioni globali. Ogni campo di una voce di log viene confrontato con il valore utilizzando l'operatore has implicitamente. Per questo esempio, se un campo in un LogEntry, o se il suo payload, contiene la frase "Il gatto nel cappello", il confronto è riuscito.

La seconda riga è un esempio di confronto che è un'espressione booleana del modulo [FIELD_NAME] [OP] [VALUE]. Gli elementi del confronto sono descritti di seguito:

  • [FIELD_NAME] è un campo in una voce di log. Ad esempio, resource.type.

  • [OP] è un operatore di confronto. Ad esempio, =.

  • [VALUE] è un numero, una stringa, una funzione o un'espressione tra parentesi. Ad esempio, "gae_app". Per i valori null JSON, utilizza NULL_VALUE.

Operatori booleani

Gli operatori booleani AND e OR sono operatori di cortocircuito. L'operatore NOT ha la precedenza più alta, seguito da OR e AND in questo ordine. Ad esempio, le seguenti due espressioni sono equivalenti:

a OR NOT b AND NOT c OR d
(a OR (NOT b)) AND ((NOT c) OR d)

Puoi omettere l'operatore AND tra i confronti. Puoi anche sostituire l'operatore NOT con l'operatore - (meno). Ad esempio, le seguenti due query sono uguali:

a=b AND c=d AND NOT e=f
a=b c=d -e=f

Questa documentazione utilizza sempre AND e NOT.

Per tutti i filtri ad eccezione dei filtri utilizzati dalle visualizzazioni di log, puoi utilizzare gli operatori AND, OR e NOT. Le visualizzazioni dei log supportano solo le operazioni AND e NOT.

Per combinare le regole AND e OR nella stessa espressione, devi nidificare le regole utilizzando le parentesi. Se non utilizzi le parentesi, la query potrebbe non funzionare come previsto.

Gli operatori booleani devono sempre essere in maiuscolo. Le lettere minuscole and, or e not vengono analizzate come termini di ricerca.

Confronti

I confronti hanno la forma seguente:

[FIELD_NAME] [OP] [VALUE]

Gli elementi del confronto sono descritti di seguito:

  • [FIELD_NAME]: è il nome del percorso di un campo in una voce di log. Ecco alcuni esempi di nome campo:

    resource.type
    resource.labels.zone
    resource.labels.project_id
    insertId
    jsonPayload.httpRequest.protocol
    labels."compute.googleapis.com/resource_id"
    

    Se un componente del nome di un percorso ha caratteri speciali, il nome del percorso deve essere racchiuso tra virgolette. Ad esempio, compute.googleapis.com/resource_id deve essere racchiuso tra virgolette perché contiene una barra /.

    Per i dettagli, consulta gli identificatori di percorsi di campo in questo documento.

  • [OP]: è un operatore di confronto, uno dei seguenti:

    =           -- equal
    !=          -- not equal
    > < >= <=   -- numeric ordering
    :           -- "has" matches any substring in the log entry field
    =~          -- regular expression search for a pattern
    !~          -- regular expression search not for a pattern
    

Per informazioni su come cercare le voci di log utilizzando espressioni regolari, vedi Utilizzare espressioni regolari.

  • [VALUE]: è un numero, una stringa, una funzione o un'espressione principale. Le stringhe vengono utilizzate per rappresentare testo arbitrario, oltre a valori booleani, enumerazioni e stringhe di byte. [VALUE] viene convertito nel tipo del campo prima del confronto. Per i valori null JSON, utilizza NULL_VALUE.

Per filtrare in base a un valore null JSON, utilizza la sintassi seguente:

jsonPayload.field = NULL_VALUE      -- includes "field" with null value
NOT jsonPayload.field = NULL_VALUE  -- excludes "field" with null value

Se [VALUE] è una combinazione booleana di confronti tra parentesi, il nome del campo e l'operatore di confronto vengono applicati a ogni elemento. Ad esempio:

jsonPayload.cat = ("longhair" OR "shorthair")
jsonPayload.animal : ("nice" AND "pet")

Il primo confronto controlla che il campo cat abbia il valore "longhair" o "shorthair". Il secondo controlla che il valore del campo animal contenga entrambe le parole "nice" e "pet", in qualsiasi ordine.

Identificatori di percorsi sul campo

Tutte le voci di log sono istanze di tipo LogEntry. L'identificatore che è (o inizia) il lato sinistro di un confronto deve essere un campo definito nel tipo LogEntry. Per i dettagli sui possibili identificatori e sui relativi valori, consulta il tipo di voce di log.

Ecco l'elenco attuale dei campi delle voci di log. Ogni campo è seguito dal livello successivo di nome, se applicabile:

  • httpRequest: { cacheFillBytes, cacheHit, cacheLookup, cacheValidatedWithOriginServer, latency, protocol, referer, remoteIp, requestMethod, requestSize, requestUrl, responseSize, serverIp, status, userAgent }
  • insertId
  • jsonPayload { variabile }
  • labels { variabile }
  • logName
  • metadata {systemLabels, userLabels}
  • operation {id, producer, first, last}
  • protoPayload {@type, variabile }
  • receiveTimestamp
  • resource {type, labels}
  • severity
  • sourceLocation: { file, line, function }
  • spanId
  • textPayload
  • timestamp
  • trace

Di seguito sono riportati alcuni esempi di identificatori di percorsi di campo che puoi utilizzare nei confronti:

  • resource.type: se il primo identificatore del percorso è resource, l'identificatore successivo deve essere un campo nel tipo MonitoredResource.

  • httpRequest.latency: se il primo identificatore del percorso è httpRequest, l'identificatore successivo deve essere un campo nel tipo HttpRequest.

  • etichette.[KEY] Se il primo identificatore del percorso è labels, l'identificatore successivo, [KEY], deve essere una delle chiavi contenute nelle coppie chiave-valore visualizzate nel campo labels.

  • logName: poiché il campo logName è una stringa, non puoi seguirlo per nessun nome di sottocampo.

Quando esegui query sui campi map o struct, devi conservare le relative chiavi' maiuscole e minuscole e la formattazione nell'espressione.

Ad esempio, jsonPayload è un campo struct, quindi il nome di un campo nidificato all'interno di jsonPayload, ad esempio jsonPayload.end_time, è diverso da jsonPayload.endTime. Allo stesso modo, per un campo della mappa come labels, la chiave dell'etichetta labels.env_name è diversa da labels.envName. Al contrario, quando si esegue una query sul normale campo di buffer del protocollo protoPayload, non è necessario conservare la richiesta.

Per informazioni sui tipi di campo LogEntry, consulta la documentazione di riferimento di google.logging.v2.

Caratteri speciali

Se un campo LogEntry contiene caratteri speciali, il campo di log deve essere citato. Ad esempio:

jsonPayload.":name":apple

jsonPayload."foo.bar":apple

jsonPayload."\"foo\"":apple

Per l'elenco dei caratteri speciali, consulta la sezione string in Valori e conversioni.

Per ulteriori informazioni sull'utilizzo di identificatori di percorsi di campi che fanno riferimento a oggetti o array, consulta Tipi di oggetti e array in questo documento.

Tipi di risorse monitorate

Per query più rapide, specifica un tipo di risorsa monitorata. Per un elenco dei tipi di risorse, consulta Tipi di risorse monitorate.

Ad esempio, le VM di Compute Engine utilizzano il tipo di risorsa gce_instance, mentre le istanze Amazon EC2 utilizzano aws_ec2_instance. L'esempio seguente mostra come limitare le query a entrambi i tipi di VM:

resource.type = ("gce_instance" OR "aws_ec2_instance")

Nei log vengono indicizzati i valori del tipo di risorsa monitorata. L'utilizzo di corrispondenze sottostringa per tali query risulta più lento.

Campi mancanti

Se in una query utilizzi il nome di un campo che non è visualizzato in una voce di log, il campo non è specificato, non è definito o è predefinito:

  • Se il campo fa parte del payload della voce di log (jsonPayload o protoPayload) o se è in un'etichetta nella sezione labels della voce di log, significa che il campo è mancante. L'utilizzo di un campo mancante non mostrerà un errore, ma tutti i confronti che utilizzano i campi mancanti non riusciranno semplicemente.

    Esempi: jsonPayload.nearest_store, protoPayload.name.nickname

  • Se il campo è definito nel tipo LogEntry, il campo è default. I confronti vengono eseguiti come se il campo fosse presente e avesse il suo valore predefinito.

    Esempi: httpRequest.remoteIp, trace, operation.producer

  • In caso contrario, il campo è undefined, ovvero un errore che viene rilevato prima dell'utilizzo della query.

    Esempi: thud, operation.thud, textPayload.thud

Per verificare se un campo mancante o predefinito esiste senza testare un determinato valore nel campo, utilizza il confronto :*. Ad esempio, il seguente confronto ha esito positivo se il campo operation.id è presente esplicitamente in una voce di log:

operation.id:*

Osserva il comportamento delle seguenti query:

  • Quando utilizzi l'operatore booleano NOT su un campo mancante, il risultato è TRUE:

    -- Returns TRUE
    NOT missingField=foo
    
  • Quando utilizzi l'operatore di confronto != non uguale in un campo mancante, il risultato è FALSE:

    -- Returns FALSE
    missingField!=foo
    

Tipi di oggetto e array

Ogni campo delle voci di log può contenere uno scaler, un oggetto o un array.

  • Un campo scalatore memorizza un singolo valore, come 174.4 o -1. Anche un string è considerato un scalare. Anche i campi che possono essere convertiti in (o da) una stringa come Duration e Timestamp sono tipi scalari.

  • Un tipo di oggetto archivia una raccolta di valori denominati, ad esempio il seguente valore JSON:

    {"age": 24, "height": 67}
    

    Puoi fare riferimento al valore all'interno di un oggetto. Ad esempio, se jsonPayload.x contiene il valore precedente, jsonPayload.x.age avrà il valore 24.

  • Un campo array archivia un elenco di valori, tutti dello stesso tipo. Ad esempio, un campo contenente le misurazioni potrebbe avere una matrice di numeri:

    {8.5, 9, 6}
    

    Quando vengono eseguiti i confronti e [FIELD_NAME] è un campo di array, ogni membro dell'array viene confrontato con [VALUE] e i risultati vengono uniti utilizzando l'operatore OR. Ad esempio, se jsonPayload.shoeSize è un campo di array che memorizza {8.5, 9, 6}, il confronto:

    jsonPayload.shoeSize < 7
    

    equivale a:

    8.5 < 7 OR 9 < 7 OR 6 < 7
    

    In questo esempio, il confronto complessivo restituisce una valutazione riuscita.

Valori e conversioni

Il primo passaggio nella valutazione di un confronto consiste nel convertire il valore laterale destro nel tipo del campo della voce di log. Nei tipi di campo consentiti sono consentiti confronti, oltre a due tipi aggiuntivi i cui valori sono rappresentati come stringhe: Duration e Timestamp. Per un elenco dei tipi di scalabilità, consulta l'elenco dei tipi di buffer di protocollo della scalabilità. La seguente tabella spiega quali valori possono essere convertiti nei tipi di campi di log:

Tipo di campo Valore della query consentito
bool

"Vero" o "falso" in qualsiasi lettera. Esempi: "True", "true"

bytes

Una stringa contenente una sequenza di byte. Esempio: "\377\377".

Duration

Una stringa contenente un numero decimale seguito da una delle unità &nst;ns", "us", "ms", "s", "m", o "h". La durata è precisa in nanosecondi. Esempio: "3.2s".

enum

Il nome del valore letterale di tipo di enumerazione, senza distinzione tra maiuscole e minuscole. Esempi: "WARNING", che è un valore di tipo LogSeverity.

double

Qualsiasi numero, con o senza un segno e una parte esponenziale, o le speciali stringhe di valore "NaN", "-Infinity" e "Infinity" (in maiuscolo o meno). Esempi: "-3.2e-8", "nan".

intNN

Qualsiasi numero intero firmato che non superi la dimensione del tipo. Esempio: "-3".

string

Qualsiasi stringa contenente testo con codifica UTF-8 o ASCII a 7 bit. Le virgolette devono essere precedute dal carattere di escape con una barra rovesciata.

I valori delle stringhe devono essere racchiusi tra virgolette per evitare i seguenti caratteri speciali:

  • Stringhe che iniziano con + (più), - (meno) o . (punto).

  • Stringhe con ~ (tilde), = (uguale a), () (parentesi), : (due punti), > (maggiore di), < (minore di), , (virgola) o . (punto).

  • Qualsiasi sequenza di escape, ad esempio \t.

Timestamp

Una stringa in formato RFC 3339 o ISO 8601. Esempi" Nelle espressioni di query, i timestamp in formato RFC 3339 possono specificare un fuso orario con"Z"o ±hh:mm. I timestamp sono rappresentati con una precisione nanoseconda.

uintNN

Qualsiasi numero intero senza segno che non superi la dimensione del tipo. Esempio: "1234".

Se un tentativo di conversione non va a buon fine, il confronto non va a buon fine.

Quando una conversione richiede una stringa, puoi anche utilizzare un numero o del testo tra virgolette, se non contengono caratteri speciali come spazi e operatori. Analogamente, quando una conversione richiede un numero, puoi utilizzare una stringa i cui contenuti sono un numero.

I tipi intNN e uintNN rappresentano tipi interi di varie dimensioni, ad esempio int32 e uint64. Quando scrivi un valore da convertire in un tipo intero a 64 bit, scrivi il valore come stringa, ad esempio "9223372036854775807".

Tipi di campi del log

Ecco come viene determinato il tipo di campo di una voce di log:

  • I campi di log definiti nel tipo LogEntry e nel tipo di componente sono campi buffer di protocollo. I campi del buffer di protocollo hanno tipi espliciti.

  • I campi di log che fanno parte di oggetti protoPayload sono anche campi buffer di protocollo e hanno tipi espliciti. Il nome del tipo di buffer di protocollo è memorizzato nel campo "@type" di protoPayload. Per ulteriori informazioni, consulta la mappatura JSON.

    Quando filtri un campo associato al tipo di messaggio Any, il campo value viene automaticamente spostato. Pertanto, non includerlo nella query. Per ulteriori informazioni, consulta la sezione Risoluzione dei problemi.

  • I campi di log all'interno di jsonPayload hanno tipi dedotti dal valore del campo quando viene ricevuta la voce di log:

    • I campi con valori non racchiusi tra virgolette hanno il tipo double.
    • I campi con valori true o false sono di tipo bool.
    • I campi i cui valori sono stringhe hanno tipo string.

    I numeri interi lunghi (64 bit) vengono archiviati in campi stringa, perché non possono essere rappresentati esattamente come valori double.

  • I tipi Duration e Timestamp vengono riconosciuti solo nei campi del buffer di protocollo. Altrove, questi valori sono memorizzati in campi stringa.

Commenti

I commenti iniziano con due trattini (--) e il testo che segue i trattini viene ignorato fino alla fine della riga. I commenti possono essere inseriti all'inizio di un filtro, tra i termini e alla fine di un filtro.

Puoi utilizzare i commenti per i seguenti casi:

  • Per annotare i filtri complessi con informazioni sul funzionamento di una clausola:

     -- All of our target users are emitted by Compute Engine instances.
     resource.type = "gce_instance"
     -- Looking for logs from "alex".
     jsonPayload.targetUser = "alex"

  • Per attivare o disattivare rapidamente una clausola aggiungendo o rimuovendo il prefisso del commento:

     resource.type = "gce_instance"
     -- jsonPayload.targetUser = "alex"
     jsonPayload.targetUser = "kiran"
     -- jsonPayload.targetUser = "sasha"

Operatori di confronto

Il significato degli operatori di uguaglianza (=, !=) e di disuguaglianza (<, <=, >, >=) dipende dal tipo sottostante del nome del campo a sinistra.

  • Tutti i tipi numerici: uguaglianza e disuguaglianza hanno il significato normale per numeri.
  • bool: uguaglianza significa lo stesso valore booleano. La disuguaglianza è definita da true>false.
  • enum: "uguaglianza" significa lo stesso valore di enumerazione. La disuguaglianza utilizza i valori numerici sottostanti dei valori letterali di enumerazione.
  • Duration: uguaglianza significa che ha la stessa durata. La disuguaglianza si basa sulla durata della durata. Esempio: come durate, "1s">"999ms".
  • Timestamp: uguaglianza significa lo stesso istante nel tempo. Se a e b sono Timestamp valori, a < b significa che a è precedente al tempo di b.
  • bytes: i Operandi vengono confrontati per byte, da sinistra a destra.
  • string: i confronti ignorano le lettere maiuscole. In particolare, entrambi gli operandi vengono normalizzati tramite la normalizzazione Unicode NFKC_CF e quindi utilizzando i confronti lexicografici. Tuttavia, le ricerche di espressioni regolari non sono normalizzate. Per ulteriori informazioni sulla ricerca di voci di log utilizzando espressioni regolari, vedi Utilizzo di espressioni regolari.

L'operatore della sottostringa (:) è applicabile a string e bytes e viene gestito come uguaglianza, tranne per il fatto che l'operando destro deve essere uguale solo a una parte del campo a sinistra. Le corrispondenze di sottostringhe nei campi indicizzati non traggono vantaggio dagli indici di log.

Limitazioni globali

Se il confronto consiste in un singolo valore, si parla di limitazione globale. Logging utilizza l'operatore has (:) per determinare se un campo in una voce di log o il relativo payload contiene la limitazione globale. In caso affermativo, il confronto ha esito positivo.

La query più semplice scritta in termini di limitazione globale è un singolo valore:

"The Cat in The Hat"

Per una query più interessante, puoi combinare le limitazioni globali utilizzando gli operatori AND e OR. Ad esempio, se vuoi visualizzare tutte le voci di log che hanno un campo con cat e un campo che contiene hat o bat, scrivi la query come:

(cat AND (hat OR bat))

In questo caso esistono tre limitazioni globali: cat, hat e bat. Queste limitazioni globali vengono applicate separatamente e i risultati vengono combinati, proprio come se l'espressione fosse stata scritta senza parentesi.

Una limitazione globale è un modo semplice per eseguire query sui log per un determinato valore. Ad esempio, se cerchi nel log delle attività voci contenenti una menzione di GCE_OPERATION_DONE, puoi utilizzare la seguente query:

logName = "projects/my-project-id/logs/compute.googleapis.com%2Factivity_log" AND
"GCE_OPERATION_DONE"

Anche se le limitazioni globali sono facili, possono essere lente; per saperne di più, consulta Trovare rapidamente le voci di log in questo documento.

Functions

Puoi utilizzare le funzioni integrate come restrizioni globali nelle query:

function = identifier ( [ argument { , argument } ] )

dove argument è un valore, un nome di campo o un'espressione di tipo parenthesize. Le funzioni sono descritte nelle sezioni seguenti.

log_id

La funzione log_id restituisce le voci di log corrispondenti all'argomento [LOG_ID] specificato nel campo logName:

log_id([LOG_ID])

Ad esempio, la seguente query restituisce tutte le voci di log con un cloudaudit.googleapis.com%2Factivity [LOG_ID]:

log_id("cloudaudit.googleapis.com/activity")

origine

La funzione source corrisponde alle voci di log di una particolare risorsa nella gerarchia di organizzazioni, cartelle e progetti Cloud.

La funzione source non corrisponde alle risorse figlio. Ad esempio, l'utilizzo di source(folders/folder_123) corrisponde ai log della risorsa folder_123 e non ai log delle risorse di progetto Cloud all'interno di folder_123.

Per eseguire query sui log a un determinato livello di risorsa, utilizza la sintassi seguente:

source(RESOURCE_TYPE/RESOURCE_ID)
Risorsa Query di esempio
Organizzazione source(organizations/ORGANIZATION_ID)
cartella source(folders/FOLDER_ID)
Progetti cloud source(projects/PROJECT_ID)

esempio

La funzione sample seleziona una frazione del numero totale di voci di log:

sample([FIELD], [FRACTION])

[FIELD] è il nome di un campo nella voce di log, ad esempio logName o jsonPayload.a_field. Il valore del campo determina se la voce di log è nel campione. Il tipo di campo deve essere una stringa o un valore numerico. Impostare [FIELD] su insertId è una buona scelta, perché ogni voce di log ha un valore diverso per quel campo.

[FRACTION] è la frazione delle voci di log con valori da includere in [FIELD]. È un numero maggiore di 0,0 e non superiore a 1,0. Ad esempio, se specifichi 0.01, l'esempio conterrà circa l'1% di tutte le voci di log con valori per [FIELD]. Se [FRACTION] è 1, vengono scelte tutte le voci di log con valori per [FIELD].

Esempio: la seguente query restituisce il 25% delle voci di log dal log syslog:

logName = "projects/my-project/logs/syslog" AND sample(insertId, 0.25)

Dettagli: un algoritmo deterministico, basato sull'hashing, viene utilizzato per determinare se una voce di log è inclusa o esclusa dal campione. L'accuratezza del campione risultante dipende dalla distribuzione dei valori sottoposti ad hashing. Se i valori sottoposti ad hashing non vengono distribuiti in modo uniforme, il campione risultante può essere inclinato. Nel caso peggiore, quando [FIELD] contiene sempre lo stesso valore, l'esempio risultante contiene l'[FRACTION] di tutte le voci di log o nessuna voce di log.

Se in una voce di log viene visualizzato [FIELD], significa che:

  • Viene calcolato un hash del valore.
  • Il valore hash, che è un numero, è diviso per il valore massimo possibile.
  • Se la frazione risultante è minore o uguale a [FRACTION], la voce di log viene inclusa nell'esempio; in caso contrario viene esclusa dal campione.

Se [FIELD] non viene visualizzato in una voce di log, allora:

  • Se [FIELD] fa parte della sezione del payload della voce di log o della sezione labels, la voce di log non viene selezionata per l'esempio, anche se [FRACTION] è 1.
  • In caso contrario, la voce di log viene considerata come se [FIELD] si trova nella voce di log e il valore di [FIELD] è il valore predefinito. Il valore predefinito è determinato dal tipo LogEntry. Per ulteriori informazioni sui campi mancanti e predefiniti, vedi Campi mancanti in questo documento.

Per escludere dal log le voci di log con campi predefiniti, utilizza l'operatore di campo-exists, :*. La query seguente produce un campione dell'1% di voci di log che hanno fornito esplicitamente un valore per field:

field:* AND sample(field, 0.01)

IP_in_net

La funzione ip_in_net determina se un indirizzo IP in una voce di log è contenuto in una subnet. Potresti utilizzarlo per sapere se una richiesta proviene da una fonte interna o esterna. Ad esempio:

ip_in_net([FIELD], [SUBNET])

[FIELD] è un campo con valore stringa nella voce di log che contiene un indirizzo o un intervallo IP. Il campo può essere ripetuto, nel qual caso solo uno dei campi ripetuti dovrà contenere un indirizzo o un intervallo.

[SUBNET] è una costante di stringa per un indirizzo o intervallo IP. È un errore se [SUBNET] non è un intervallo o un indirizzo IP legale, come descritto più avanti in questa sezione.

Esempio: la seguente query verifica un indirizzo IP nel payload delle voci di log del log my_log:

logName = "projects/my_project/logs/my_log" AND
ip_in_net(jsonPayload.realClientIP, "10.1.2.0/24")

Dettagli: se, in una voce di log, [FIELD] non è presente, l'impostazione predefinita o non contiene un indirizzo o un intervallo IP legali, la funzione restituisce false. Per ulteriori informazioni sui campi mancanti e predefiniti, consulta la sezione Campi mancanti in questo documento.

Di seguito sono riportati alcuni esempi di indirizzi e intervalli IP supportati:

  • IPv4: 10.1.2.3
  • Subnet IPv4: 10.1.2.0/24
  • IPv6 CIDR: 1234:5678:90ab:cdef:1234:5678:90ab:cdef
  • Subnet IPv6 CIDR: 1:2::/48

Ricerca per ora

Nell'interfaccia puoi impostare limiti specifici per la data e l'ora da visualizzare per le voci di log. Ad esempio, se aggiungi le seguenti condizioni alla query, l'anteprima mostra esattamente le voci di log nel periodo indicato di 30 minuti e non potrai scorrere al di fuori di questo intervallo di date:

timestamp >= "2016-11-29T23:00:00Z" timestamp <= "2016-11-29T23:30:00Z"

Quando scrivi una query con un timestamp, devi utilizzare date e ore nel formato indicato sopra.

Puoi anche cercare le voci di log utilizzando le scorciatoie di timestamp. Ad esempio, puoi inserire una data con un operatore di confronto per ottenere tutte le voci di log dopo un determinato giorno:

timestamp > "2016-11-29"

Utilizzo di espressioni regolari

Puoi utilizzare espressioni regolari per creare query e creare filtri per sink, metriche e ovunque vengano utilizzati i filtri dei log. Puoi utilizzare espressioni regolari nel Query Builder e con Google Cloud CLI.

Un'espressione regolare è una sequenza di caratteri che definisce una ricerca. Il linguaggio di query di logging utilizza la sintassi RE2. Per una spiegazione completa della sintassi RE2, consulta il wiki RE2 su GitHub.

Le query delle espressioni regolari hanno le seguenti caratteristiche:

  • Solo i campi del tipo di stringa possono essere abbinati a un'espressione regolare.

  • La normalizzazione delle stringhe non viene eseguita; ad esempio, kubernetes non è considerata come KUBERNETES. Per ulteriori informazioni, consulta la sezione Operatori di confronto.

  • Le query sono sensibili alle maiuscole e non sono ancorate per impostazione predefinita.

  • Gli operatori booleani possono essere utilizzati tra più espressioni regolari sul lato destro dell'operatore di confronto delle espressioni regolari, =~ e !~.

Una query con espressione regolare ha la seguente struttura:

Corrispondenza di una sequenza:

jsonPayload.message =~ "regular expression pattern"

Non corrisponde a un pattern:

jsonPayload.message !~ "regular expression pattern"

=~ e !~ trasformano la query in una query con espressione regolare e il pattern che stai cercando di trovare deve corrispondere a virgolette doppie. Per eseguire una query per i pattern che contengono virgolette doppie, esegui l'escape con una barra rovesciata.

Esempi di esecuzione di query sui log che utilizzano espressioni regolari

Tipo di query Esempio
Query standard sourceLocation.file =~ "foo"
Query con ricerca senza distinzione tra maiuscole e minuscole labels.subnetwork_name =~ "(?i)foo"
Query contenente virgolette jsonPayload.message =~ "field1=\"bar.*\""
Query che utilizza un or booleano labels.pod_name =~ "(foo|bar)"
Query con ancoraggi logName =~ "/my%2Flog$"
Query non corrispondente a un pattern labels.pod_name !~ "foo"
Query mediante operatore booleano labels.env =~ ("^prod.*server" OR "^staging.*server")
Query che inizia con un valore logName =~ "^foo"
Query che termina con un valore logName =~ "foo$"

Individuazione rapida delle voci di log

Per trovare le voci di log in modo più efficiente:

  • Query che utilizza campi indicizzati.
  • Riduci al minimo il numero di voci di log che devono essere cercate.

Utilizzare i campi indicizzati

Logging indicizza sempre i seguenti campi LogEntry:

Puoi anche aggiungere campi indicizzati personalizzati a qualsiasi bucket di log.

Le sezioni seguenti spiegano come utilizzare i campi indicizzati per ridurre al minimo il numero di voci di log in cui eseguire la ricerca.

Ottimizzare le query

Velocizza le tue ricerche riducendo il numero di log, il numero di voci di log o l'intervallo di tempo delle ricerche. Ancora meglio, puoi ridurre tutti e tre.

Esempio: utilizza il nome di log corretto

Specifica il log contenente le voci di log che ti interessano. Assicurati di conoscere il nome effettivo del log controllando una delle voci. Ad esempio, l'anteprima mostra un log nella sezione Compute Engine denominata "activity". Esaminando in modo più accurato le voci del log di controllo dell'attività di amministrazione, il log è in realtà denominato "quoaudit;cloudaudit.googleapis.com/activity".

Il seguente confronto è errato. Non corrisponde a nulla, perché utilizza il nome di log errato:

logName = "projects/my-project-id/logs/activity"   -- WRONG!

Il seguente confronto è corretto. Sceglie le voci di log dalle voci di log di controllo Attività di amministrazione. Devi codificare URL nel nome log, come mostrato di seguito:

logName = "projects/my-project-id/logs/cloudaudit.googleapis.com%2Factivity"

Esempio: scegli le voci di log corrette

Se sai che le voci di log che vuoi provengono da una determinata istanza VM, specificalo. Controlla i nomi delle etichette corretti controllando una delle voci di log che vuoi cercare. Nell'esempio seguente, instance_id è una delle etichette indicizzate:

resource.type = "gce_instance" AND
resource.labels.instance_id = "6731710280662790612"
logName = "projects/my-project-id/logs/cloudaudit.googleapis.com%2Factivity"

Esempio: scegli il periodo di tempo giusto

Specifica un periodo di tempo in cui eseguire la ricerca. Un modo rapido per determinare i timestamp utili nel formato RFC 3339 è utilizzare il comando date GNU/Linux:

$ date --rfc-3339=s 2016-06-27 17:39:00-04:00 $ date --rfc-3339=s --date="3 hours ago" 2016-06-27 14:40:00-04:00 $ date --rfc-3339=s --date="5 hours ago" 2016-06-27 12:40:00-04:00

Utilizza i valori di questi timestamp nelle query seguenti. Per creare un timestamp accettabile per Logging, sostituisci lo spazio tra la data e l'ora con la lettera T.

Ad esempio, per eseguire la ricerca nelle ultime tre ore:

timestamp >= "2016-06-27T14:40:00-04:00"

Per fare un altro esempio, per cercare tra tre e cinque ore fa:

timestamp >= "2016-06-27T12:40:00-04:00" AND timestamp <= "2016-06-27T14:40:00-04:00"

Riduci al minimo le ricerche globali e di sottostringhe

Evita la tentazione di utilizzare le scorciatoie durante la digitazione delle query.

Esempio: non utilizzare le ricerche globali

Se stai cercando una voce di log con "Hello Kitty" nel payload:

  • Non utilizzare una ricerca globale. Per un motivo, sono tutte ricerche di sottostringhe:

    "Hello Kitty" -- THIS CAUSES A SLOW SEARCH!

  • Limita la ricerca a un solo campo, anche se devi mantenere la ricerca sottostringa:

    textPayload:"Hello Kitty"

  • Utilizza un test di uguaglianza se puoi:

    textPayload = "Hello Kitty"

  • Fai riferimento ai singoli campi di un payload, se le tue voci di log hanno payload strutturati:

    jsonPayload.my_favorite_cat = "Hello Kitty"

  • . Utilizza un campo indicizzato per limitare la ricerca:

    logName = "projects/my-project_id/logs/somelog" AND jsonPayload.my_favorite_cat = "Hello Kitty"

Esempi di ricerca

Le voci di log mostrate sono quelle corrispondenti a una query. Se il menu Vai al tempo contiene un valore, il display scorre fino a quel momento. Ecco alcuni esempi di query:

resource.type=gae_app

Trova tutte le voci di log di App Engine. Per un elenco dei tipi di risorse, consulta l'elenco delle risorse monitorate.

Mentre digiti, l'anteprima suggerisce i completamenti per i campi come resource.type.

resource.type=gae_app AND logName:request_log

Trova le voci di log per le app di App Engine dai nomi di log contenenti request_log. Tieni presente quanto segue:

  • L'operatore = è un'uguaglianza esatta. Il tipo di risorsa deve essere esattamente "gae_app", ad eccezione delle lettere maiuscole e minuscole.
  • L'operatore : significa "has". Il campo logName deve contenere request_log, in qualsiasi lettera. Il nome effettivo del log è molto più lungo. L'uso della funzionalità : potrebbe rallentare le ricerche.
  • I due confronti sono uniti da AND. Puoi anche utilizzare OR, ma si presume AND se ometti l'operatore.
resource.type = (gce_instance OR aws_ec2_instance) AND severity >= ERROR

Trova le voci di log con uno dei due tipi di risorsa: istanza VM di Compute Engine o istanza VM AWS EC2. Le voci di log devono avere un severity di almeno ERROR, che equivale a selezionare ERRORE nel menu di gravità dell'interfaccia della query.

logName = "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"

Trova tutte le voci del log di controllo dell'attività di amministrazione nel progetto [PROJECT_ID]. Gli audit log utilizzano tutti lo stesso nome di log in un progetto, ma hanno tipi di risorse diversi. L'ID log cloudaudit.googleapis.com/activity deve essere codificato tramite URL nel nome log. L'uso dell'uguaglianza nei confronti accelera la ricerca. Per ulteriori informazioni, consulta Informazioni sugli audit log.

unicorn

Trova le voci di log contenenti unicorn in qualsiasi campo, utilizzando qualsiasi lettera maiuscola. Un termine di ricerca che non fa parte di un confronto di campi è una query "tutti i campi".

unicorn phoenix

Trova le voci di log che contengono unicorn in un campo e phoenix in un campo.

textPayload:(unicorn phoenix)

Trova le voci di log il cui campo textPayload contiene sia unicorn che phoenix in qualsiasi ordine; AND è implicito tra le due parole.

textPayload:"unicorn phoenix"

Trova le voci di log il cui campo textPayload contiene la stringa "unicorn phoenix".

NOT textPayload: "unicorn phoenix"

Trova le voci di log il cui campo textPayload non contiene la stringa "unicorn phoenix". Questo tipo di query riduce le voci di log indesiderate.

timestamp >= "2016-11-29T23:00:00Z" timestamp <= "2016-11-29T23:30:00Z"

Trova le voci di log entro un periodo di 30 minuti.

Risolvere i problemi

Problemi di sintassi

Se hai problemi con le espressioni di query, controlla quanto segue:

  • La query rispetta le regole di sintassi, con le parentesi corrispondenti e le virgolette.

  • I nomi dei campi delle voci di log sono stati digitati correttamente.

  • Le operazioni booleane sono scritte in lettere maiuscole (AND, OR, NOT).

  • Assicurati di utilizzare NULL_VALUE per rappresentare i valori JSON null.

  • Per maggiore chiarezza, le espressioni booleane come restrizioni globali o come lato destro dei confronti devono essere indicate tra parentesi. Ad esempio, le due query seguenti hanno lo stesso aspetto, ma non sono:

    insertId = "ABC-1" OR "ABC-2" -- ERROR!? insertId = ("ABC-1" OR "ABC-2")

  • Il testo non citato deve contenere caratteri speciali. In caso di dubbi, aggiungi le virgolette. Ad esempio, il primo confronto riportato di seguito è illegale a causa dell'operatore di sottostringa incorporato (:). Il confronto deve essere scritto tra virgolette:

    insertId = abc:def -- ILLEGAL! insertId = "abc:def"

  • Google Cloud CLI richiede che la query sia tra virgolette. Per utilizzare le virgolette doppie per la escape di caratteri speciali utilizzando il comando gcloud logging, racchiudi l'intera query tra virgolette singole:

    gcloud logging read 'resource.type=gce_instance AND jsonPayload.message="Stopped Unattended Upgrades Shutdown."' gcloud logging read 'timestamp>="2020-06-17T21:00:00Z"'

  • Quando filtri un campo associato al tipo di messaggio Any, il campo value viene automaticamente spostato. Di conseguenza, non includere value nella query.

    Ad esempio, il campo Status in un messaggio AuditLog ha un campo details di tipo google.protobuf.Any. Per eseguire una query sul campo details, ometti il campo value quando specifichi il filtro:

    • Cosa fare

      protoPayload.status.details.conditionNotMet.userVisibleMessage =~ "Specified reservation.*"
      
    • No

      protoPayload.status.details.value.conditionNotMet.userVisibleMessage =~ "Specified reservation.*"