Configura el registro

La biblioteca cliente de .NET registra las solicitudes, las respuestas y los mensajes de resumen que se envían a la API de Google Ads. Los registros se pueden escribir en un TraceListener personalizado o en una instancia de ILogger personalizada.

TraceListener

Puedes habilitar el registro en un objeto TraceListener agregando las siguientes líneas en tu método Main antes de realizar cualquier llamada a la API:

using Google.Ads.GoogleAds.Util;

// Detailed logs.
TraceUtilities.Configure(
    TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE,
    "logs/details.log",
    System.Diagnostics.SourceLevels.All);

// Summary logs.
TraceUtilities.Configure(
    TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE,
    "logs/summary.log",
    System.Diagnostics.SourceLevels.All);

ILogger

Si ya utilizas un ILogger para los registros de tu aplicación, esta solución te permite integrar los registros de la API de Google Ads en tu infraestructura de registro existente.

Primero, crea un objeto LoggerFactory o, si ya tienes uno, agrega los filtros para los registros de la API de Google Ads:

var loggerFactory = LoggerFactory.Create(builder =>
{
    // Log to stdout.
    builder.AddConsole();
    builder.AddFilter(
        TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE, LogLevel.Trace);
    builder.AddFilter(
        TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE, LogLevel.Trace);
});

Luego, usa LoggerFactory para crear registradores de resúmenes y detalles de solicitudes y respuestas:

ILogger summaryLogger = loggerFactory.CreateLogger(
    TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE);
ILogger detailLogger = loggerFactory.CreateLogger(
    TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE);

Por último, configura la biblioteca cliente para que redireccione sus registros a tus instancias de ILogger:

TraceUtilities.ConfigureSummaryLogger(summaryLogger);
TraceUtilities.ConfigureDetailLogger(detailLogger);

Esta solución te permite integrar los registros de solicitudes a la API y respuestas de la API de Google Ads en frameworks de registro existentes, como Log4Net, NLog y Serilog.

Niveles de registro

La biblioteca registra diferentes tipos de eventos en diferentes niveles de registro:

  • Respuesta correcta de la API: El resumen se registra en INFO; la solicitud y la respuesta completas se registran en DEBUG.
  • Respuesta de error de la API: El mensaje de resumen se registra en WARN; la solicitud y la respuesta completas se registran en INFO.
  • Fallas parciales: Se registran en DEBUG.

ID de solicitud

En la mayoría de los casos, los registros que genera la biblioteca cliente proporcionan suficientes detalles para solucionar los problemas. Cuando te comuniques con el equipo de asistencia, proporciona los registros (que, de forma predeterminada, ocultan los campos de autenticación sensibles) o comparte el ID de solicitud, que se registra como parte del registro de respuesta.

Si prefieres capturar el ID de solicitud de forma programática, usa uno de los siguientes enfoques.

Extracción de llamadas a la API unarias comunes

Puedes usar un CallSettings personalizado con un TrailingMetadataHandler para capturar IDs de solicitudes de llamadas unarias normales:

CallSettings callSettings = CallSettings.FromTrailingMetadataHandler(
    metadata =>
    {
        // Extract and log the request ID from the trailing metadata.
        string requestId = metadata.Get("request-id")?.Value;
        Console.WriteLine($"Request ID: {requestId}");
    });
// Add the campaigns.
MutateCampaignsResponse retVal = campaignService.MutateCampaigns(
    customerId.ToString(), operations.ToArray(), callSettings);

Extracción de llamadas a la API de transmisión

El ID de solicitud se devuelve como parte del objeto de respuesta para las llamadas a la API de transmisión. Por ejemplo, puedes obtener el ID de solicitud para una llamada a SearchStream de la siguiente manera:

// Get the GoogleAdsService.
GoogleAdsServiceClient googleAdsService = client.GetService(
    Services.V25.GoogleAdsService);

// Retrieve all campaigns.
string query = @"SELECT
                campaign.id,
                campaign.name,
                campaign.network_settings.target_content_network
            FROM campaign
            ORDER BY campaign.id";

// Issue a search request.
googleAdsService.SearchStream(
    customerId.ToString(),
    query,
    (SearchGoogleAdsStreamResponse resp) =>
    {
        // Extract the request ID from the response.
        string requestId = resp.RequestId;
        Console.WriteLine($"Request ID: {requestId}");
        foreach (GoogleAdsRow googleAdsRow in resp.Results)
        {
            Console.WriteLine(
                "Campaign with ID {0} and name '{1}' was found.",
                googleAdsRow.Campaign.Id,
                googleAdsRow.Campaign.Name);
        }
    }
);

Excepciones

El ID de solicitud se devuelve como parte de la excepción GoogleAdsException cada vez que falla una llamada a la API:

try
{
    // Make an API call.
}
catch (GoogleAdsException e)
{
    string requestId = e.RequestId;
    Console.WriteLine($"Failed Request ID: {requestId}");
}

Configura el registro avanzado

Si el registro de la API no te proporciona suficientes detalles, habilita el registro de nivel inferior en el nivel de transporte de gRPC. Ten en cuenta que el resultado puede ser voluminoso.

Cuando uses el transporte Grpc.Net.Client predeterminado, configura los registros a nivel del transporte a través del proveedor ILogger de .NET agregando un filtro para la categoría Grpc (por ejemplo, builder.AddFilter("Grpc", LogLevel.Debug)).

Si usas el transporte heredado Grpc.Core (UseGrpcCore = true), los registros de gRPC se escriben en stderr de forma predeterminada, o bien puedes adjuntar tu propio registrador como se muestra en el siguiente ejemplo. Para obtener más detalles, consulta las variables de entorno de gRPC compatibles.

Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());

Configuración de TraceListener con App.config (heredado)

Si tu app se compila para un destino de .NET Framework, puedes cargar la configuración de registro desde el archivo App.config o Web.config de tu app. Esta es una funcionalidad heredada de .NET que no se admite en las apps compiladas para destinos modernos de .NET.

Para usar esta función, agrega los siguientes cambios a tu archivo de configuración:

  1. Agrega el siguiente fragmento en la sección <configuration>:

    <system.diagnostics>
      <sources>
        <source name="GoogleAds.DeprecationMessages"
            switchName="GoogleAds.DeprecationMessages"
            switchType="System.Diagnostics.SourceSwitch">
          <listeners>
            <add name="myListener"
                 type="System.Diagnostics.EventLogTraceListener"
                 initializeData="Application" />
          </listeners>
        </source>
        <source name="GoogleAds.DetailedRequestLogs"
            switchName="GoogleAds.DetailedRequestLogs"
            switchType="System.Diagnostics.SourceSwitch">
          <listeners>
            <add name="detailedRequestLogListener"
                 type="System.Diagnostics.ConsoleTraceListener"
                 initializeData="true" />
            <!-- Use the following to log to a file. Modify the initializeData
                 attribute to control the path to the detailed request log
                 file. -->
            <!--
            <add name="detailedRequestLogListener"
                 type="System.Diagnostics.TextWriterTraceListener"
                 initializeData="C:\Logs\detailed_logs.log" />
            <remove name="Default" />
            -->
          </listeners>
        </source>
        <source name="GoogleAds.SummaryRequestLogs"
            switchName="GoogleAds.SummaryRequestLogs"
            switchType="System.Diagnostics.SourceSwitch">
          <listeners>
            <add name="summaryRequestLogListener"
                 type="System.Diagnostics.ConsoleTraceListener"
                 initializeData="true" />
            <!-- Use the following to log to a file. Modify the initializeData
                 attribute to control the path to the summary request log
                 file. -->
            <!--
            <add name="summaryRequestLogListener"
                 type="System.Diagnostics.TextWriterTraceListener"
                 initializeData="C:\Logs\summary_logs.log" />
            -->
            <remove name="Default" />
          </listeners>
        </source>
      </sources>
      <switches>
        <!-- Use this trace switch to control the deprecation trace messages
             written by Google Ads .NET libraries. The default level is set to
             Warning. To disable all messages, set this value to Off. -->
        <add name="GoogleAds.DeprecationMessages" value="Warning" />
        <!-- Use this trace switch to control the detailed request logs written
             by Google Ads .NET libraries. The default level is set to Off.
             Logs are generated at both the Error and Information levels. -->
        <add name="GoogleAds.DetailedRequestLogs" value="Off" />
        <!-- Use this trace switch to control the summary request logs written
             by Google Ads .NET libraries. The default level is set to Off.
             Logs are generated at both the Error and Information levels. -->
        <add name="GoogleAds.SummaryRequestLogs" value="Off" />
      </switches>
      <trace autoflush="true" />
    </system.diagnostics>
    
  2. Agrega el siguiente fragmento en la sección <configSections>:

    <section name="system.diagnostics"
             type="System.Diagnostics.SystemDiagnosticsSection" />
    

    Tu App.config se verá de la siguiente manera:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="GoogleAdsApi"
                 type="System.Configuration.DictionarySectionHandler" />
        <section name="system.diagnostics"
                 type="System.Diagnostics.SystemDiagnosticsSection" />
      </configSections>
      <GoogleAdsApi>
        <!-- Google Ads API settings. -->
      </GoogleAdsApi>
      <system.diagnostics>
        <!-- Logging settings. -->
      </system.diagnostics>
    </configuration>