Configura el registro

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

TraceListener

Para habilitar el registro en un TraceListener, agrega 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 usas 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 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 el LoggerFactory para crear registradores para los resúmenes y detalles de las 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 redireccionar sus seguimientos a tus instancias de ILogger:

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

Esta solución te permite integrar los registros de solicitudes 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 completa y la respuesta 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 detalles suficientes para solucionar tus problemas. Cuando te comuniques con el equipo de asistencia, proporciona los registros (que redactan los campos de autenticación sensibles de forma predeterminada) o comparte el ID de solicitud, que se registra como parte del registro de respuesta.

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

Extracción de llamadas a la API unarias ordinarias

Puedes usar un CallSettings personalizado con un TrailingMetadataHandler para capturar IDs de solicitud de llamadas unarias regulares:

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 muestra 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 SearchStream de la siguiente manera:

// Get the GoogleAdsService.
GoogleAdsServiceClient googleAdsService = client.GetService(
    Services.V26.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 muestra 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 de 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 Grpc.Core heredado (UseGrpcCore = true), los registros de gRPC se escriben en stderr de forma predeterminada, o 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 es compatible con 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>