Como gravar, ver e responder a registros

Como gravar registros

O Cloud Functions inclui geração de registros simples por padrão. Os registros gravados em stdout ou stderr serão exibidos automaticamente no Console do Cloud. Para ter uma geração de registros mais avançada, use a biblioteca de cliente do Stackdriver Logging.

Node.js

exports.helloWorld = (req, res) => {
  console.log('I am a log entry!');
  console.error('I am an error!');
  res.end();
};
A maioria das entradas de registro não tem um nível de registro associado. São eles:

  • Registros emitidos usando console.log(), console.info(), console.warn() ou console.error()
  • Registros gravados diretamente em stdout ou stderr

Mensagens internas do sistema têm o nível DEBUG.

Python

def hello_world(data, context):
    """Background Cloud Function.
    Args:
         data (dict): The dictionary with data specific to the given event.
         context (google.cloud.functions.Context): The event metadata.
    """
    print('Hello, stdout!')
  • Os registros da saída padrão ou do erro padrão não têm um nível de registro associado.
  • Mensagens internas do sistema têm o nível DEBUG.

Go


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"fmt"
	"log"
	"net/http"
)

// HelloLogging logs messages.
func HelloLogging(w http.ResponseWriter, r *http.Request) {
	log.Println("This is stderr")
	fmt.Println("This is stdout")

	// Structured logging can be used to set severity levels.
	// See https://cloud.google.com/logging/docs/structured-logging.
	fmt.Println(`{"message": "This has ERROR severity", "severity": "error"}`)

	// cloud.google.com/go/logging can optionally be used for additional options.
}
  • Os registros de stdout ou stderr não têm um nível de registro associado.
  • Mensagens internas do sistema têm o nível DEBUG.

Java


import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.logging.Logger;

public class LogHelloWorld implements HttpFunction {

  private static final Logger logger = Logger.getLogger(LogHelloWorld.class.getName());

  @Override
  public void service(HttpRequest request, HttpResponse response)
      throws IOException {
    System.out.println("I am a log to stdout!");
    System.err.println("I am a log to stderr!");

    logger.info("I am an info log!");
    logger.warning("I am a warning log!");

    BufferedWriter writer = response.getWriter();
    writer.write("Messages successfully logged!");
  }
}
  • Os registros de stdout ou stderr não têm um nível de registro associado.
  • Mensagens internas do sistema têm o nível DEBUG.

Como visualizar registros

Como usar a ferramenta de linha de comando

Os registros do Cloud Functions são visíveis na IU do Stackdriver Logging e por meio da ferramenta de linha de comando gcloud.

Para ver os registros com a ferramenta gcloud, use o comando logs read:

gcloud functions logs read

Para ver os registros de uma função específica, digite o nome da função como argumento:

gcloud functions logs read FUNCTION_NAME

Dá até para ver os registros de uma execução específica:

gcloud functions logs read FUNCTION_NAME --execution-id EXECUTION_ID

Para conferir a gama completa de opções de visualização de registros, consulte a ajuda para logs read:

gcloud functions logs read --help

Como usar o painel do Logging

Também é possível ver os registros do Cloud Functions no Console do Cloud.

Como usar a API Logging

Os registros também podem ser gravados e recuperados por meio da API Logging. As bibliotecas de cliente do Stackdriver Logging oferecem uma interface idiomática para a API Logging:

Node.js

Para ver mais informações, consulte a referência da biblioteca de cliente do Node.js.
// Imports the Google Cloud client library
const {Logging} = require('@google-cloud/logging');

// Creates a client
const logging = new Logging();

/**
 * TODO(developer): Uncomment the following line to run the code.
 */
// const logName = 'Name of the log from which to list entries, e.g. my-log';

const log = logging.log(logName);

async function printEntryMetadata() {
  // List the most recent entries for a given log
  // See
  // https://googlecloudplatform.github.io/google-cloud-node/#/docs/logging/latest/logging?method=getEntries
  const [entries] = await log.getEntries();
  console.log('Logs:');
  entries.forEach(entry => {
    const metadata = entry.metadata;
    console.log(`${metadata.timestamp}:`, metadata[metadata.payload]);
  });
}
printEntryMetadata();

Python

Para mais informações, consulte a referência da biblioteca de cliente do Python.
def list_entries(logger_name):
    """Lists the most recent entries for a given logger."""
    logging_client = logging.Client()
    logger = logging_client.logger(logger_name)

    print('Listing entries for logger {}:'.format(logger.name))

    for entry in logger.list_entries():
        timestamp = entry.timestamp.isoformat()
        print('* {}: {}'.format
              (timestamp, entry.payload))

Go

Para mais informações, consulte a referência da biblioteca de cliente do Go.
var entries []*logging.Entry
const name = "log-example"
iter := adminClient.Entries(ctx,
	// Only get entries from the log-example log.
	logadmin.Filter(fmt.Sprintf(`logName = "projects/%s/logs/%s"`, projID, name)),
	// Get most recent entries first.
	logadmin.NewestFirst(),
)

// Fetch the most recent 20 entries.
for len(entries) < 20 {
	entry, err := iter.Next()
	if err == iterator.Done {
		return entries, nil
	}
	if err != nil {
		return nil, err
	}
	entries = append(entries, entry)
}
return entries, nil

Java

Para mais informações, consulte a referência da biblioteca de cliente do Java.

import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.cloud.logging.v2.LoggingClient;
import com.google.cloud.logging.v2.LoggingClient.ListLogEntriesPagedResponse;
import com.google.logging.v2.ListLogEntriesRequest;
import com.google.logging.v2.LogEntry;
import java.io.IOException;
import java.io.PrintWriter;

public class RetrieveLogs implements HttpFunction {

  private LoggingClient client;

  // Retrieve the latest Cloud Function log entries
  @Override
  public void service(HttpRequest request, HttpResponse response)
      throws IOException {
    // Get the LoggingClient for the function.
    client = getClient();

    // Construct the request
    ListLogEntriesRequest entriesRequest =
        ListLogEntriesRequest.newBuilder()
            .setPageSize(10)
            .setFilter("resource.type=\"cloud_function\"")
            .build();

    ListLogEntriesPagedResponse entriesResponse = client.listLogEntries(entriesRequest);

    var writer = new PrintWriter(response.getWriter());
    for (LogEntry entry : entriesResponse.getPage().getValues()) {
      writer.printf("%s: %s%n", entry.getLogName(), entry.getTextPayload());
    }
    writer.printf("%n%nLogs retrieved successfully.%n");
  }

  // Returns a client for interacting with the Logging API. The client is stored in the global scope
  // and reused by all requests.
  private LoggingClient getClient() throws IOException {
    if (client == null) {
      client = LoggingClient.create();
    }
    return client;
  }
}

Como responder a registros

Responda a eventos registrados pelo Stackdriver enviando os registros para uma função do Cloud. Para mais informações, consulte a página Acionadores secundários com o Stackdriver.