Questo documento spiega come trovare le voci di log instradate da Cloud Logging alle tabelle BigQuery. I sink di log caricano i dati di log in BigQuery in piccoli batch, il che ti consente di eseguire query sui dati senza eseguire un job di caricamento. Per aiutarti a creare query e comprendere il formato della tabella BigQuery, questo documento descrive anche lo schema BigQuery per i log instradati.
Cloud Logging utilizza l'API di flusso precedente per inviare le voci di log in streaming a BigQuery. In genere, le voci di log sono visibili in BigQuery entro un minuto. Tuttavia, quando viene creata una nuova tabella, potrebbero essere necessari diversi minuti prima che le prime voci di log siano disponibili.
Prima di iniziare
Per una discussione concettuale degli elementi di destinazione, consulta Panoramica dei modelli di routing e archiviazione: elementi di destinazione.
Per istruzioni su come instradare i log, consulta Instradare i log verso le destinazioni supportate.
Per scoprire come sono denominati i campi delle voce di log instradati, consulta Schema di BigQuery per i log instradati.
Visualizza i log
Per visualizzare i log inviati a BigQuery:
-
Nella console Google Cloud, vai alla pagina BigQuery:
Puoi trovare questa pagina anche utilizzando la barra di ricerca.
Nel riquadro Spazio di esplorazione, espandi il progetto e seleziona un set di dati.
Le voci di log sono visibili nella scheda Dettagli oppure puoi eseguire una query sulla tabella per visualizzare i dati.
Query di esempio
Per informazioni sulla sintassi delle query BigQuery, consulta Riferimento alle query. Particolarmente utili sono le funzioni carattere jolly della tabella, che consentono di eseguire query su più tabelle, e l'operatore appiattimento, che consente di visualizzare i dati dei campi ripetuti.
Query Compute Engine di esempio
La seguente query BigQuery recupera le voci di log di più giorni e di più tipi di log:
La query cerca negli ultimi tre giorni dei log
syslog
eapache-access
. La query è stata eseguita il 23 febbraio 2020 e riguarda tutte le voci di log ricevute il 21 e il 22 febbraio, oltre alle voci di log ricevute il 23 febbraio fino al momento dell'emissione della query.La query recupera i risultati per una singola istanza Compute Engine,
1554300700000000000
.
SELECT timestamp AS Time, logName as Log, textPayload AS Message FROM (TABLE_DATE_RANGE(my_bq_dataset.syslog_, DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())), (TABLE_DATE_RANGE(my_bq_dataset.apache_access_, DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())) WHERE resource.type == 'gce_instance' AND resource.labels.instance_id == '1554300700000000000' ORDER BY time;
Ecco alcune righe di output di esempio:
Row | Time | Log | Message --- | ----------------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- 5 | 2020-02-21 03:40:14 UTC | projects/project-id/logs/syslog | Feb 21 03:40:14 my-gce-instance collectd[24281]: uc_update: Value too old: name = 15543007601548826368/df-tmpfs/df_complex-used; value time = 1424490014.269; last cache update = 1424490014.269; 6 | 2020-02-21 04:17:01 UTC | projects/project-id/logs/syslog | Feb 21 04:17:01 my-gce-instance /USR/SBIN/CRON[8082]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly) 7 | 2020-02-21 04:49:58 UTC | projects/project-id/logs/apache-access | 128.61.240.66 - - [21/Feb/2020:04:49:58 +0000] "GET / HTTP/1.0" 200 536 "-" "masscan/1.0 (https://github.com/robertdavidgraham/masscan)" 8 | 2020-02-21 05:17:01 UTC | projects/project-id/logs/syslog | Feb 21 05:17:01 my-gce-instance /USR/SBIN/CRON[9104]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly) 9 | 2020-02-21 05:30:50 UTC | projects/project-id/log/syslogapache-access | 92.254.50.61 - - [21/Feb/2020:05:30:50 +0000] "GET /tmUnblock.cgi HTTP/1.1" 400 541 "-" "-"
Query di App Engine di esempio
La seguente query BigQuery recupera le richieste App Engine non andate a buon fine dell'ultimo mese:
SELECT timestamp AS Time, protoPayload.host AS Host, protoPayload.status AS Status, protoPayload.resource AS Path FROM (TABLE_DATE_RANGE(my_bq_dataset.appengine_googleapis_com_request_log_, DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), CURRENT_TIMESTAMP())) WHERE protoPayload.status != 200 ORDER BY time
Ecco alcuni risultati:
Row | Time | Host | Status | Path --- | ----------------------- | ------------------------------------- | ------ | ------ 6 | 2020-02-12 19:35:02 UTC | default.my-gcp-project-id.appspot.com | 404 | /foo?thud=3 7 | 2020-02-12 19:35:21 UTC | default.my-gcp-project-id.appspot.com | 404 | /foo 8 | 2020-02-16 20:17:19 UTC | my-gcp-project-id.appspot.com | 404 | /favicon.ico 9 | 2020-02-16 20:17:34 UTC | my-gcp-project-id.appspot.com | 404 | /foo?thud=%22what???%22
Schema BigQuery per i log instradati
Gli schemi delle tabelle BigQuery per i log instradati si basano sulla struttura del tipo LogEntry
e sui contenuti dei payload dei log. Cloud Logging applica anche regole per abbreviare i nomi dei campi dello schema BigQuery per gli audit log e per determinati campi del payload strutturato. Puoi visualizzare lo schema della tabella selezionando una tabella con voci di log instradate nell'interfaccia BigQuery.
Convenzioni di denominazione dei campi
Esistono alcune convenzioni di denominazione che si applicano ai campi voce di log quando si inviano i log a BigQuery:
I nomi dei campi delle voci di log non possono superare i 128 caratteri.
I nomi dei campi delle voci di log possono essere composti solo da caratteri alfanumerici. Eventuali caratteri non supportati vengono rimossi dai nomi dei campi e sostituiti con caratteri underscore. Ad esempio,
jsonPayload.foo%%
verrebbe trasformato injsonPayload.foo__
.I nomi dei campi delle voci di log devono iniziare con un carattere alfanumerico, anche dopo la trasformazione. Eventuali trattini bassi iniziali vengono rimossi.
Per i campi di voce di log che fanno parte del tipo
LogEntry
, i nomi dei campi BigQuery corrispondenti sono esattamente gli stessi dei campi di voce di log.Per tutti i campi voce di log forniti dall'utente, i nomi dei campi BigQuery corrispondenti vengono normalizzati in minuscolo, ma la denominazione viene conservata.
Per i campi nei payload strutturati, a condizione che il parametro
@type
non sia presente, i nomi dei campi BigQuery corrispondenti vengono normalizzati alle lettere minuscole, ma la denominazione viene conservata.Per informazioni sui payload strutturati in cui è presente il parametro
@type
, consulta Campi del payload con@type
in questa pagina.
I seguenti esempi mostrano come vengono applicate queste convenzioni di denominazione:
Campo della voce di log | Mappatura del tipo LogEntry |
Nome del campo BigQuery |
---|---|---|
insertId |
insertId |
insertId |
textPayload |
textPayload |
textPayload |
httpRequest.status |
httpRequest.status |
httpRequest.status |
httpRequest.requestMethod.GET |
httpRequest.requestMethod.[ABC] |
httpRequest.requestMethod.get |
resource.labels.moduleid |
resource.labels.[ABC] |
resource.labels.moduleid |
jsonPayload.MESSAGE |
jsonPayload.[ABC] |
jsonPayload.message |
jsonPayload.myField.mySubfield |
jsonPayload.[ABC].[XYZ] |
jsonPayload.myfield.mysubfield |
Campi del payload con @type
Questa sezione illustra i nomi dei campi dello schema BigQuery speciali per le voci di log i cui payload contengono lo specificatore @type
. Sono incluse le voci del log di controllo indirizzate a BigQuery.
I payload nelle voci di log possono contenere dati strutturati. Qualsiasi campo strutturato può includere un'opzione facoltativa per specificare il tipo nel seguente formato:
@type: type.googleapis.com/[TYPE]
Le regole di denominazione spiegano perché il campo protoPayload
di una voce di log di controllo potrebbe essere mappato al campo protopayload_auditlog
dello schema BigQuery.
Regole di denominazione per @type
I campi strutturati con specificatori di tipo vengono solitamente assegnati ai nomi dei campi BigQuery a cui è stato aggiunto [TYPE]
. Il valore di [TYPE]
può essere una stringa qualsiasi.
Le regole di denominazione per @type
si applicano solo al livello superiore di jsonPayload
o
protoPayload
; i campi nidificati vengono ignorati. Quando vengono trattati i campi del payload strutturato di primo livello, la registrazione rimuove il prefisso type.googleapis.com
.
Ad esempio, la tabella seguente mostra la mappatura dei campi del payload strutturato di primo livello ai nomi dei campi BigQuery:
Payload | Payload @type | Campo Payload | Nome del campo BigQuery |
---|---|---|---|
jsonPayload |
(nessuno) | statusCode |
jsonPayload.statusCode |
jsonPayload |
type.googleapis.com/abc.Xyz |
statusCode |
jsonpayload_abc_xyz.statuscode |
protoPayload |
(nessuno) | statusCode |
protoPayload.statuscode |
protoPayload |
type.googleapis.com/abc.Xyz |
statusCode |
protopayload_abc_xyz.statuscode |
Alle regole precedenti per i campi con specificatori di tipo si applicano alcune eccezioni:
Nei log delle richieste di App Engine, il nome del payload nei log inviati a BigQuery è
protoPayload
, anche se il payload include un specificatore di tipo.Cloud Logging applica alcune regole speciali per abbreviare i nomi dei campi dello schema BigQuery per gli audit log. Questo argomento è trattato nella sezione Campi dei log di controllo di questa pagina.
Esempio
Questo esempio mostra come vengono denominati e utilizzati i campi del payload strutturato quando vengono ricevuti da BigQuery.
Supponiamo che il payload di una voce di log sia strutturato come segue:
jsonPayload: {
@type: "type.googleapis.com/google.cloud.v1.CustomType"
name_a: {
sub_a: "A value"
}
name_b: {
sub_b: 22
}
}
La mappatura ai campi BigQuery è la seguente:
Il campo strutturato di primo livello
jsonPayload
contiene uno specificatore@type
. Il nome BigQuery èjsonpayload_v1_customtype
.I campi nidificati vengono trattati con le regole di denominazione standard di BigQuery, poiché le regole per gli specificatori di tipo non si applicano ai campi nidificati.
Pertanto, per il payload della voce del log sono definiti i seguenti nomi BigQuery:
jsonpayload_v1_customtype
jsonpayload_v1_customtype._type
jsonpayload_v1_customtype.name_b
jsonpayload_v1_customtype.name_b.sub_b
jsonpayload_v1_customtype.name_a
jsonpayload_v1_customtype.name_a.sub_a
Campi degli audit log
Se non utilizzi i log di controllo inviati a BigQuery, puoi saltare questa sezione.
I campi del payload del log di controllo protoPayload.request
, protoPayload.response
e protoPayload.metadata
hanno specificatori @type
, ma vengono trattati come dati JSON. In altre parole, i nomi degli schemi BigQuery sono i nomi dei campi con Json
aggiunto e contengono dati di stringa in formato JSON.
I due insiemi di nomi di campi del payload del log di controllo sono elencati nella tabella seguente:
Campo della voce di log | Nome del campo BigQuery |
---|---|
protoPayload |
protopayload_auditlog |
protopayload.metadata |
protopayload_auditlog.metadataJson |
protoPayload.serviceData |
protopayload_auditlog.servicedata_v1_bigquery Esempio: protopayload_auditlog.servicedata_v1_bigquery.tableInsertRequest |
protoPayload.request |
protopayload_auditlog.requestJson |
protoPayload.response |
protopayload_auditlog.responseJson |
Tieni presente che la convenzione di denominazione serviceData
è specifica per i log di controllo generati da BigQuery e instradati da Cloud Logging a BigQuery. Queste voci del log di controllo contengono un
serviceData
campo con un parametro @type di
type.googleapis.com/google.cloud.bigquery.logging.v1.auditdata
.
Esempio
Una voce di log di controllo generata da BigQuery ha un campo con il seguente nome:
protoPayload.serviceData.tableInsertRequest
Se questa voce di log venisse inoltrata a BigQuery, a quale campo tableInsertRequest
verrebbe fatto riferimento? Prima dell'abbreviazione del nome, il
nome del campo corrispondente in BigQuery sarebbe:
protopayload_google_cloud_audit_auditlog.servicedata_google_cloud_bigquery_logging_v1_auditdata.tableInsertRequest
Dopo l'abbreviazione del nome, viene fatto riferimento allo stesso campo nelle tabelle BigQuery come segue:
protopayload_auditlog.servicedata_v1_bigquery.tableInsertRequest
Organizzazione della tabella
Questa sezione fornisce una panoramica delle tabelle partizionate per i log inviati a BigQuery.
Quando inoltri i log a un set di dati BigQuery, la funzionalità Logging crea tabelle per contenere le voci dei log. La prima voce di log ricevuta da BigQuery determina lo schema per la tabella BigQuery di destinazione. BigQuery crea una tabella le cui colonne si basano sui campi della prima voce di log e suoi tipi. Le voci di log successive potrebbero causare una mancata corrispondenza dello schema. Per informazioni su quando si verificano e su come vengono gestiti, consulta Mancata corrispondenza nello schema.
Esistono due tipi di tabelle con cui logging organizza i dati che instrada: tabelle con suddivisione in base alla data e
tabelle partizionate. Entrambi i tipi di tabelle partizionano i dati dei log in base ai campi timestamp
delle voci di log. Tuttavia, esistono due differenze fondamentali tra i tipi di tabella, come segue:
Prestazioni: una tabella partizionata suddivide una tabella di grandi dimensioni in partizioni più piccole, in modo da poter migliorare le prestazioni delle query e, di conseguenza, controllare meglio i costi di BigQuery riducendo il numero di byte letti da una query.
Nomenclatura delle tabelle: i tipi di tabelle utilizzano convenzioni di denominazione diverse, come discusso nella sezione di seguito.
Organizzazione della tabella
Le voci di log vengono suddivise in tabelle BigQuery la cui organizzazione e i cui nomi si basano sui nomi e sui timestamp dei log delle voci.
I nomi delle tabelle sono preceduti dal suffisso della data di calendario del timestamp UTC della voce di log, utilizzando il formato di base ISO 8601 (AAAAMMGG).
La tabella seguente mostra esempi di come i nomi dei log e i timestamp dei sample vengono mappati ai nomi delle tabelle in BigQuery:
Nome log | Voce del log timestamp 1 |
Nome della tabella BigQuery (con sharding per data) |
Nome tabella BigQuery (partizionata) |
---|---|---|---|
syslog |
2017-05-23T18:19:22.135Z |
syslog_20170523 |
syslog |
apache-access |
2017-01-01T00:00:00.000Z |
apache_access_20170101 |
apache_access |
compute.googleapis.com/activity_log |
2017-12-31T23:59:59.999Z |
compute_googleapis_com_activity_log_20171231 |
compute_googleapis_com_activity_log |
1 I timestamp voce di log sono espressi in UTC (Tempo coordinato universale).
Creazione delle tabelle partizionate
Quando crei un sink per instradare i log a BigQuery, puoi utilizzare tabelle con suddivisione in partizioni per data o tabelle partizionate. La selezione predefinita è una tabella suddivisa in parti in base alla data:
Per istruzioni su come creare i canali, consulta le seguenti risorse:
Console Google Cloud: Indirizza i log alle destinazioni supportate.
Google Cloud CLI:
gcloud logging sinks create
.
Mancate corrispondenze nello schema
La prima voce di log ricevuta da BigQuery determina lo schema per la tabella BigQuery di destinazione. BigQuery crea una tabella le cui colonne si basano sui campi della prima voce di log e suoi tipi.
Una mancata corrispondenza dello schema si verifica quando le voci di log vengono scritte nella tabella di destinazione e si verifica uno dei seguenti errori:
Una voce di log successiva modifica il tipo di campo per un campo esistente nella tabella.
Ad esempio, se il campo
jsonPayload.user_id
della voce di log iniziale è unstring
, questa voce di log genera una tabella con un tipo di stringa per quel campo. Se in un secondo momento inizi a registrarejsonPayload.user_id
comearray
, si verifica una mancata corrispondenza dello schema.Una nuova voce di log contiene un campo che non è nello schema attuale e l'inserimento di questo campo nella tabella di destinazione supererebbe il limite di colonne BigQuery.
La tabella di destinazione può accettare il nuovo campo se non comporta il superamento del limite di colonne.
Quando BigQuery identifica una mancata corrispondenza dello schema, crea una tabella
nel set di dati corrispondente per archiviare le informazioni sull'errore. Il tipo di tabella determina il nome della tabella. Per le tabelle con suddivisione in parti in base alla data, il formato dei nomi è
export_errors_YYYYMMDD
. Per le tabelle partizionate, il formato dei nomi è
export_errors
. Per ulteriori informazioni, consulta
Organizzazione delle tabelle.
Quando inoltra le voci di log, Logging invia i messaggi come batch a BigQuery. BigQuery utilizza le seguenti regole per determinare in quale tabella vengono scritte le voci di log nel batch corrente di messaggi:
Quando si verifica una modifica del tipo di campo, nella tabella degli errori vengono registrate solo le voci di log che hanno causato una mancata corrispondenza dello schema. Le voci di log nel batch corrente di messaggi che non causano una mancata corrispondenza dello schema vengono scritte nella tabella di destinazione originale.
Quando viene superato il limite di colonne, tutte le voci di log del batch corrente di messaggi vengono scritte nella tabella degli errori.
Schema della tabella degli errori
La tabella degli errori contiene i dati di LogEntry
e informazioni sulla mancata corrispondenza:
logEntry
: contiene la voce di log completa, che viene tuttavia convertita da JSON in una stringa.schemaErrorDetail
: contiene il messaggio di errore completo restituito da BigQuery.sink
: contiene il percorso completo della risorsa per lsink di log.logName
: estratto daLogEntry
.timestamp
: estratto daLogEntry
.receiveTimestamp
: estratto daLogEntry
.severity
: estratto daLogEntry
.insertId
: estratto daLogEntry
.trace
: estratto daLogEntry
.resourceType
: estratto daLogEntry
.
La registrazione comunica le mancate corrispondenze dello schema al progetto Google Cloud che contiene l'obiettivo di routing nei seguenti modi:
- I proprietari del progetto ricevono un'email. I dettagli includeranno: ID progetto Google Cloud, nome della destinazione e destinazione.
- Nella pagina Attività della console Google Cloud viene visualizzato un errore,
Stackdriver Config error
. I dettagli includono il nome e la destinazione della destinazione e un link a un esempio di voce di log che ha causato l'errore.
Evitare future mancate corrispondenze dei tipi di campo
Per correggere le mancate corrispondenze del tipo di campo per le voci di log successive, correggi il tipo di campo in modo che corrisponda allo schema corrente. Per informazioni su come correggere un tipo di campo, consulta Modificare il tipo di dati di una colonna.
A volte il tipo di campo non può essere modificato, ad esempio non puoi modificare un tipo di campo per i log generati automaticamente dai servizi Google Cloud. Per evitare mancate corrispondenze dello schema quando non puoi modificare un tipo di campo, rinomina la tabella o modifica i parametri del sink in modo che Logging ricrei la tabella in un set di dati diverso. Per le istruzioni, vedi Gestire i sink.
Risoluzione dei problemi
Se nella destinazione del sink sembrano mancare dei log o se sospetti che il sink non stia instradando correttamente i log, consulta Risolvere i problemi relativi all'instradamento dei log.
Prezzi
Cloud Logging non addebita alcun costo per il routing dei log a una destinazione supportata. Tuttavia, la destinazione potrebbe applicare dei costi.
Ad eccezione del bucket di log _Required
,
Cloud Logging addebita lo streaming dei log nei bucket di log e
per l'archiviazione per un periodo superiore al periodo di conservazione predefinito del bucket di log.
Cloud Logging non addebita alcun costo per la copia dei log, per la definizione degli ambiti dei log o per le query inviate tramite le pagine Esplora log o Analisi dei log.
Per ulteriori informazioni, consulta i seguenti documenti:
- Riepilogo dei prezzi di Cloud Logging
Costi di destinazione:
- I costi di generazione dei log di flusso VPC si applicano quando invii e poi escludi i log di flusso Virtual Private Cloud da Cloud Logging.