Registro

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

TraceListener

Para habilitar el registro en un TraceListener, agrega la siguiente línea a tu método Main antes de realizar llamadas a la API.

using Google.Ads.GoogleAds.Util;
...

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

// Summary logs.
TraceUtilities.Configure(TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE,
    "C:\\logs\\details.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 los registros existentes.

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(delegate (ILoggingBuilder 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 a fin de crear registradores para 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 seguimientos a tus instancias ILogger:

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

Esta solución te permite integrar los registros de solicitud y respuesta 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 distintos niveles de registro. Para obtener una respuesta exitosa de la API, el resumen se registra en INFO, y la solicitud completa y las respuestas se registran en DEBUG.

En una solicitud que genera un error de API, el mensaje de resumen se registra en WARN, y la solicitud y respuesta completas se registran en INFO.

Los errores 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 los problemas. Cuando te comuniques con el foro o los alias de asistencia, puedes proporcionar los registros (que ocultan la información sensible de forma predeterminada) o solo compartir el ID de solicitud (que se registra como parte del registro de respuestas).

Si prefieres capturar el ID de solicitud por tu cuenta, puedes usar uno de los siguientes enfoques:

Extracción mediante llamadas a la API comunes

Puedes usar un CallSetting personalizado con un TrailingMetadataHandler para capturar IDs de solicitud de llamadas unarias regulares.

CallSettings callSettings = CallSettings.FromTrailingMetadataHandler(
    delegate (Metadata metadata) {
        // Extract the request ID from the trailing metadata.
        string requestId = metadata.Get("request-id").Value;
    });
// Add the campaigns.
MutateCampaignsResponse retVal = campaignService.MutateCampaigns(
    customerId.ToString(), operations.ToArray(), callSettings);

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

El ID de solicitud se muestra como parte del objeto de respuesta para la transmisión de llamadas a la API. 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.V16.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,
    delegate (SearchGoogleAdsStreamResponse resp)
    {
        // Extract the request ID from the response.
        string requestId = resp.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;
}

Registro avanzado

Si el registro de la API no te brinda suficientes detalles, habilita el registro de bajo nivel a nivel de gRPC. Ten en cuenta que la salida puede ser voluminosa. Los registros de gRPC se escriben en stderr, pero puedes adjuntar tu propio registrador como se muestra a continuación. Variables de entorno 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 de .NET heredada que no es compatible con apps compiladas para objetivos de .NET Core.

Para utilizar esta función, debes agregar 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 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 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 Ads* .NET libraries. The default is level is set to
             Warning. To disable all messages, set this value to Off. See
             msdn.microsoft.com/en-us/library/system.diagnostics.sourcelevels.aspx
             for all possible values this key can take. -->
        <add name="GoogleAds.DeprecationMessages" value="Warning"/>
        <!-- Use this trace switch to control the detailed request logs written by 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
             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>