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 la siguiente línea 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,
    "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 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 tus 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 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 que redireccione 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 los frameworks de registro existentes, como Log4Net, NLog y Serilog.

Niveles de registro

La biblioteca registra diferentes tipos de eventos en diferentes niveles de registro. Para una respuesta de API correcta, el resumen se registra en INFO, y la solicitud y las respuestas completas 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 la respuesta completas se registran en INFO.

Las 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 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 simplemente compartir el ID de solicitud (que se registra como parte del registro de respuestas).

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

Extracción a través de llamadas a la API ordinarias

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

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 a través de llamadas a la API de transmisión

El ID de la 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 de una llamada a SearchStream de la siguiente manera:

// Get the GoogleAdsService.
GoogleAdsServiceClient googleAdsService = client.GetService(
    Services.V19.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 la 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 más registros de nivel inferior a nivel de gRPC. Ten en cuenta que el resultado puede ser voluminoso. 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 las apps compiladas para objetivos de .NET Core.

Para usar 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>