Generazione e visualizzazione dei log in Cloud Run

Questa pagina descrive i log disponibili quando utilizzi Cloud Run e come visualizzare e scrivere i log.

Cloud Run ha due tipi di log, che vengono inviati automaticamente a Cloud Logging:

  • Log delle richieste (solo servizi): log delle richieste inviate ai servizi Cloud Run. Questi log vengono creati automaticamente.
  • Log dei container (servizi, job e pool di worker): log emessi dalle istanze, in genere dal tuo codice, scritti nelle posizioni supportate come descritto in Scrittura dei log dei container.

Visualizza i log

Puoi visualizzare i log per il tuo servizio, job o pool di worker in diversi modi:

Entrambi i metodi di visualizzazione dei log nella console esaminano gli stessi log archiviati in Cloud Logging, ma Esplora log di Cloud Logging fornisce più dettagli e più funzionalità di filtro.

Visualizza i log in Cloud Run

Puoi visualizzare i log nella pagina Cloud Run per le seguenti risorse:

Visualizzare i log per un servizio

Per visualizzare i log del servizio nella pagina Cloud Run:

  1. Vai a Cloud Run

  2. Fai clic sul servizio nell'elenco visualizzato.

  3. Fai clic sulla scheda LOG per visualizzare i log delle richieste e dei container per tutte le revisioni di questo servizio. Puoi filtrare in base al livello di gravità del log.

Visualizzare i log di un job

Per visualizzare i log dei job nella pagina Cloud Run:

  1. Vai a Cloud Run

  2. Fai clic su Job.

  3. Individua il job nell'elenco dei job e fai clic su di esso.

  4. Fai clic sulla scheda LOG per visualizzare i log dei container per tutte le esecuzioni di questo job. Puoi filtrare in base al livello di gravità del log.

  5. In alternativa, se vuoi visualizzare i log prefiltrati per una specifica esecuzione del job, fai clic sull'esecuzione del job e poi sulla scheda LOG.

Visualizzare i log per un worker pool

Per visualizzare i log del pool di worker nella pagina Cloud Run:

  1. Vai a Cloud Run

  2. Fai clic su Pool di worker.

  3. Fai clic sul pool di worker nell'elenco visualizzato.

  4. Fai clic sulla scheda LOG per visualizzare i log delle richieste e dei container per tutte le revisioni di questo pool di worker. Puoi filtrare in base al livello di gravità del log.

Visualizza i log del servizio utilizzando Google Cloud CLI

Puoi utilizzare Google Cloud CLI per visualizzare i log di coda o leggere i log esistenti per un servizio Cloud Run nella riga di comando. Per impostazione predefinita, i log vengono formattati in un formato a riga singola ottimizzato per la console.

Per visualizzare i log in coda, devi installare il componente log-streaming in Google Cloud CLI. Se il componente non è installato, ti verrà chiesto di installarlo quando necessario.

Visualizzare i log di coda nella riga di comando

Per un servizio Cloud Run, puoi visualizzare i log in tempo reale dal tuo servizio Cloud Run direttamente nella riga di comando:

gcloud beta run services logs tail SERVICE --project PROJECT-ID

Sostituisci:

  • SERVICE con il nome del servizio Cloud Run.
  • PROJECT-ID con l' Google Cloud ID progetto. Puoi visualizzare l'ID progetto eseguendo il comando gcloud config get-value project.

Leggere i log nella riga di comando

Per un servizio Cloud Run, puoi leggere i log esistenti in due modi:

  • In un formato ottimizzato per la console:
    gcloud run services logs read SERVICE --limit=10 --project PROJECT-ID
  • Direttamente da Cloud Logging:
    gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE" --project PROJECT-ID --limit 10

Sostituisci:

  • SERVICE con il nome del servizio Cloud Run.
  • PROJECT-ID con l' Google Cloud ID progetto. Puoi visualizzare l'ID progetto eseguendo il comando gcloud config get-value project.

Visualizza i log in Cloud Logging

Per visualizzare i log di Cloud Run in Esplora log di Cloud Logging:

  1. Vai alla pagina Esplora log nella consoleGoogle Cloud :

    Vai alla pagina Esplora log

  2. Seleziona un progetto Google Cloud esistente nella parte superiore della pagina oppure creane uno nuovo.

  3. Utilizzando i menu a discesa, seleziona la risorsa:

    • Revisione Cloud Run per un servizio
    • Job Cloud Run per un job
    • Pool di worker Cloud Run per un worker pool

Per ulteriori informazioni, consulta la pagina Utilizzo di Esplora log.

Visualizza i log di servizio in Cloud Code

Per visualizzare i log in Cloud Code, leggi le guide per IntelliJ e Visual Studio Code.

Leggere i log in modo programmatico

Se vuoi leggere i log in modo programmatico, puoi utilizzare uno dei seguenti metodi:

Scrivere log dei container

Quando scrivi i log dal tuo servizio, job o pool di worker, questi vengono rilevati automaticamente da Cloud Logging, a condizione che vengano scritti in una delle seguenti posizioni:

La maggior parte degli sviluppatori dovrebbe scrivere i log utilizzando l'output standard e l'errore standard.

I log dei container scritti in queste posizioni supportate vengono associati automaticamente al servizio, alla revisione e alla posizione di Cloud Run, al pool di worker, alla revisione e alla posizione di Cloud Run o al job Cloud Run. Le eccezioni contenute in questi log vengono acquisite e segnalate in Error Reporting.

La registrazione integrata bilancia affidabilità e utilizzo delle risorse e dovrebbe funzionare per la maggior parte delle applicazioni. La scrittura di voci di log utilizzando la registrazione integrata non consuma la quota per il numero di richieste entries.write al minuto dell&#39API Cloud Loggingng.

Se la tua applicazione ha requisiti di volume o affidabilità più elevati, ti consigliamo di utilizzare direttamente l'API Cloud Logging, come libreria all'interno dell'applicazione o come container sidecar separato.

Utilizzare testo semplice anziché JSON strutturato nei log

Quando scrivi i log, puoi inviare una semplice stringa di testo o una singola riga di JSON serializzato, chiamato anche dati "strutturati". Viene rilevato e analizzato da Cloud Logging e inserito in jsonPayload. Al contrario, il semplice messaggio di testo viene inserito in textPayload.

Scrittura di log strutturati

Il seguente snippet mostra come scrivere voci di log strutturate. Mostra anche come correlare i messaggi di log con il log delle richieste corrispondente.

Node.js


// Uncomment and populate this variable in your code:
// const project = 'The project ID of your function or Cloud Run service';

// Build structured log messages as an object.
const globalLogFields = {};

// Add log correlation to nest all log messages beneath request log in Log Viewer.
// (This only works for HTTP-based invocations where `req` is defined.)
if (typeof req !== 'undefined') {
  const traceHeader = req.header('X-Cloud-Trace-Context');
  if (traceHeader && project) {
    const [trace] = traceHeader.split('/');
    globalLogFields['logging.googleapis.com/trace'] =
      `projects/${project}/traces/${trace}`;
  }
}

// Complete a structured log entry.
const entry = Object.assign(
  {
    severity: 'NOTICE',
    message: 'This is the default display field.',
    // Log viewer accesses 'component' as 'jsonPayload.component'.
    component: 'arbitrary-property',
  },
  globalLogFields
);

// Serialize to a JSON string and output.
console.log(JSON.stringify(entry));

Python

# Uncomment and populate this variable in your code:
# PROJECT = 'The project ID of your Cloud Run service';

# Build structured log messages as an object.
global_log_fields = {}

# Add log correlation to nest all log messages.
# This is only relevant in HTTP-based contexts, and is ignored elsewhere.
# (In particular, non-HTTP-based Cloud Functions.)
request_is_defined = "request" in globals() or "request" in locals()
if request_is_defined and request:
    trace_header = request.headers.get("X-Cloud-Trace-Context")

    if trace_header and PROJECT:
        trace = trace_header.split("/")
        global_log_fields[
            "logging.googleapis.com/trace"
        ] = f"projects/{PROJECT}/traces/{trace[0]}"

# Complete a structured log entry.
entry = dict(
    severity="NOTICE",
    message="This is the default display field.",
    # Log viewer accesses 'component' as jsonPayload.component'.
    component="arbitrary-property",
    **global_log_fields,
)

print(json.dumps(entry))

Vai

La struttura di ogni voce di log è fornita da un tipo Entry:


// Entry defines a log entry.
type Entry struct {
	Message  string `json:"message"`
	Severity string `json:"severity,omitempty"`
	Trace    string `json:"logging.googleapis.com/trace,omitempty"`

	// Logs Explorer allows filtering and display of this as `jsonPayload.component`.
	Component string `json:"component,omitempty"`
}

// String renders an entry structure to the JSON format expected by Cloud Logging.
func (e Entry) String() string {
	if e.Severity == "" {
		e.Severity = "INFO"
	}
	out, err := json.Marshal(e)
	if err != nil {
		log.Printf("json.Marshal: %v", err)
	}
	return string(out)
}

Quando viene registrata una struct Entry, viene chiamato il metodo String per eseguirne il marshalling nel formato JSON previsto da Cloud Logging:


func init() {
	// Disable log prefixes such as the default timestamp.
	// Prefix text prevents the message from being parsed as JSON.
	// A timestamp is added when shipping logs to Cloud Logging.
	log.SetFlags(0)
}

func indexHandler(w http.ResponseWriter, r *http.Request) {
	// Uncomment and populate this variable in your code:
	// projectID = "The project ID of your Cloud Run service"

	// Derive the traceID associated with the current request.
	var trace string
	if projectID != "" {
		traceHeader := r.Header.Get("X-Cloud-Trace-Context")
		traceParts := strings.Split(traceHeader, "/")
		if len(traceParts) > 0 && len(traceParts[0]) > 0 {
			trace = fmt.Sprintf("projects/%s/traces/%s", projectID, traceParts[0])
		}
	}

	log.Println(Entry{
		Severity:  "NOTICE",
		Message:   "This is the default display field.",
		Component: "arbitrary-property",
		Trace:     trace,
	})

	fmt.Fprintln(w, "Hello Logger!")
}

Java

Abilita la registrazione JSON con Logback e SLF4J abilitando Logstash JSON Encoder nella configurazione di logback.xml.

// Build structured log messages as an object.
Object globalLogFields = null;

// Add log correlation to nest all log messages beneath request log in Log Viewer.
// TODO(developer): delete this code if you're creating a Cloud
//                  Function and it is *NOT* triggered by HTTP.
String traceHeader = req.headers("x-cloud-trace-context");
if (traceHeader != null && project != null) {
  String trace = traceHeader.split("/")[0];
  globalLogFields =
      kv(
          "logging.googleapis.com/trace",
          String.format("projects/%s/traces/%s", project, trace));
}
// -- End log correlation code --

// Create a structured log entry using key value pairs.
// For instantiating the "logger" variable, see
// https://cloud.google.com/run/docs/logging#run_manual_logging-java
logger.error(
    "This is the default display field.",
    kv("component", "arbitrary-property"),
    kv("severity", "NOTICE"),
    globalLogFields);

Personalizza i nomi dei campi standard per escludere i contenuti indesiderati dall'importazione nel payload dei log. Per un elenco dei nomi dei campi e dei formati dei dati previsti, consulta Utilizzare l'agente di logging.

<configuration>
  <appender name="jsonConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <!-- Ignore default logging fields -->
      <fieldNames>
        <timestamp>[ignore]</timestamp>
        <version>[ignore]</version>
        <logger>[ignore]</logger>
        <thread>[ignore]</thread>
        <level>[ignore]</level>
        <levelValue>[ignore]</levelValue>
      </fieldNames>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="jsonConsoleAppender"/>
  </root>
</configuration>

Campi JSON speciali nei messaggi

Quando fornisci un log strutturato come dizionario JSON, alcuni campi speciali vengono rimossi da jsonPayload e scritti nel campo corrispondente della LogEntry generata, come descritto nella documentazione relativa ai campi speciali.

Ad esempio, se il tuo JSON include una proprietà severity, questa viene rimossa da jsonPayload e viene visualizzata come severity della voce di log. Se presente, la proprietà message viene utilizzata come testo di visualizzazione principale della voce di log. Per saperne di più sulle proprietà speciali, leggi la sezione Risorsa di logging di seguito.

Correlare i log dei container con un log di richiesta (solo servizi)

In Esplora log, i log correlati dallo stesso trace sono visualizzabili in formato "padre-figlio": quando fai clic sull'icona a forma di triangolo a sinistra della voce di log della richiesta, i log del container correlati a quella richiesta vengono visualizzati nidificati sotto il log della richiesta.

I log dei container non vengono correlati automaticamente ai log delle richieste, a meno che tu non utilizzi una libreria client di Cloud Logging. Per correlare i log dei container con i log delle richieste senza utilizzare una libreria client, puoi utilizzare una riga di log JSON strutturata che contiene un campo logging.googleapis.com/trace con l'identificatore di traccia estratto dall'intestazione X-Cloud-Trace-Context, come mostrato nell'esempio precedente per la registrazione strutturata.

Controllare l'utilizzo delle risorse del log delle richieste (solo servizi)

I log delle richieste vengono creati automaticamente. Sebbene non sia possibile controllare la quantità di log delle richieste direttamente da Cloud Run, puoi utilizzare la funzionalità di esclusione dei log di Cloud Logging.

Una nota sugli agenti Logging

Se hai utilizzato Cloud Logging con determinati prodotti Google Cloud , ad esempio Compute Engine, potresti aver utilizzato gli agenti di logging di Cloud Logging. Cloud Run non utilizza agenti di logging perché supporta la raccolta dei log.

Nomi delle risorse di logging

I nomi delle risorse di logging per Cloud Run sono:

Risorse di logging

Se fai clic su una voce di log in Esplora log, si apre una voce di log in formato JSON in modo da poter esaminare in dettaglio le informazioni che ti interessano.

Tutti i campi di una voce di log, come timestamp, gravità e httpRequest sono standard e sono descritti nella documentazione di una voce di log.

Cloud Run aggiunge metadati aggiuntivi, in modo da poter identificare l'origine di un log. Ciò include le (etichette impostate sul servizio Cloud Run) e le etichette delle risorse specifiche di Cloud Run.

Campi delle voci di log per un servizio

Di seguito è riportato un elenco dei campi che si trovano nella voce di log per un servizio Cloud Run:

Campo Valori e note
LogEntry.labels.instanceId L'istanza che ha gestito la richiesta.
LogEntry.labels.run.googleapis.com/base_image_versions La versione dell'immagine di base utilizzata dal servizio. Viene visualizzato solo per i servizi di cui è stato eseguito il deployment dall'origine e se sono attivati gli aggiornamenti automatici della sicurezza.
LogEntry.labels.run.googleapis.com/cloud_event_id L'ID CloudEvent. Viene visualizzato solo per i servizi che ricevono eventi da Eventarc.
LogEntry.labels.run.googleapis.com/cloud_event_source L'origine CloudEvent. Viene visualizzato solo per i servizi che ricevono eventi da Eventarc.
LogEntry.labels.mylabel,
LogEntry.labels.mysecondlabel
Le etichette impostate da te sul servizio.
LogEntry.logName Identifica il log, ad esempio log delle richieste, errore standard, output standard e così via.
LogEntry.resource.labels.location Identifica la località Google Cloud del servizio.
LogEntry.resource.labels.project_id Il progetto in cui viene eseguito il deployment del servizio.
LogEntry.resource.labels.revision_name La revisione che ha pubblicato la richiesta.
LogEntry.resource.labels.service_name Il servizio che ha gestito la richiesta.
LogEntry.resource.type cloud_run_revision. Il tipo di risorsa Cloud Run.

Ecco un esempio di voce di log delle richieste per un servizio Cloud Run:

{
 httpRequest: {}
 insertId:  "5c82b3d1000ece0000000000"
 labels: {
  instanceId:  "00bf4bf00000fb59c906a00000c9e29c2c4e06dce91500000000056008d2b6460f163c0057b97b2345f2725fb2423ee5f0bafd36df887fdb1122371563cf1ff453717282afe000001"
  mylabel: "mylabelvalue"
  mysecondlabel: "mysecondlabelvalue"
 }
 logName:  "projects/my-project/logs/run.googleapis.com%2Frequests"
 receiveTimestamp:  "2019-03-08T18:26:25.981686167Z"
 resource: {
  labels: {
   configuration_name:  "myservice"
   location:  "europe-west1"
   project_id:  "my-project"
   revision_name:  "myservice-00002"
   service_name:  "myservice"
  }
  type:  "cloud_run_revision"
 }
 severity:  "INFO"
 timestamp:  "2019-03-08T18:26:25.970397Z"
}

Campi delle voci di log per i job

Di seguito è riportato un elenco di campi che possono essere trovati nella voce di log per un job Cloud Run:

Campo Valori e note
LogEntry.labels.instanceId L'istanza.
LogEntry.labels.mylabel,

LogEntry.labels.mysecondlabel

Le etichette impostate da te sul job.
LogEntry.logName Identifica il log, ad esempio errore standard, output standard e così via.
LogEntry.resource.labels.location Identifica la Google Cloud sede di lavoro.
LogEntry.resource.labels.project_id Il progetto in cui viene eseguito il deployment del job.
LogEntry.resource.labels.job_name Il nome del lavoro.
LogEntry.labels.execution_name Il nome dell'esecuzione del job.
LogEntry.labels.task_index L'indice dell'attività.
LogEntry.labels.task_attempt Il numero di tentativi eseguiti per questa attività.
LogEntry.resource.type cloud_run_job. Il tipo di risorsa Cloud Run.

Campi della voce di log per i worker pool

Di seguito è riportato un elenco di campi che si trovano nella voce di log per un pool di worker Cloud Run:

Campo Valori e note
LogEntry.labels.instanceId L'istanza.
LogEntry.labels.mylabel,

LogEntry.labels.mysecondlabel

Le etichette impostate da te sul pool di worker.
LogEntry.logName Identifica il log, ad esempio errore standard, output standard e così via.
LogEntry.resource.labels.location La Google Cloud posizione del worker pool.
LogEntry.resource.labels.project_id Il progetto in cui viene eseguito il deployment del pool di worker.
LogEntry.resource.labels.workerpool_name Il nome del pool di worker.
LogEntry.resource.type cloud_run_workerpool. Il tipo di risorsa Cloud Run.