Logging

Die .NET-Clientbibliothek protokolliert Anfragen, Antworten und Zusammenfassungsnachrichten, die an die Google Ads API gesendet werden. Die Logs können in einen benutzerdefinierten TraceListener, oder in eine benutzerdefinierte ILogger Instanz geschrieben werden.

TraceListener

Sie können die Protokollierung in einen TraceListener aktivieren, indem Sie die folgende Zeile in Ihrer Main-Methode hinzufügen, bevor Sie API-Aufrufe ausführen.

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);

Beachten Sie, dass TraceListeners.Configure nur einmal pro Anwendungs lebenszyklus aufgerufen werden sollte, da der TraceListener automatisch für alle API-Anfragen der Anwendung wiederverwendet wird. Sie müssen nicht für jede API-Anfrage einen neuen erstellen.

ILogger

Wenn Sie bereits einen ILogger für Ihre Anwendungsprotokolle verwenden, können Sie mit dieser Lösung Google Ads API-Logs in Ihre vorhandenen Logs einbinden.

Erstellen Sie zuerst eine LoggerFactory. Wenn Sie bereits eine haben, fügen Sie die Filter für Google Ads API-Logs hinzu:

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);
});

Verwenden Sie dann die LoggerFactory, um Logger für Zusammenfassungen und Details von Anfragen und Antworten zu erstellen:

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

Konfigurieren Sie schließlich die Clientbibliothek, um ihre Traces an Ihre ILogger-Instanzen weiterzuleiten:

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

Mit dieser Lösung können Sie Google Ads API-Anfrage- und Antwortlogs in vorhandene Protokollierungsframeworks wie Log4Net, NLog und Serilog einbinden.

Protokollebenen

Die Bibliothek protokolliert verschiedene Ereignistypen auf verschiedenen Protokollebenen. Bei einer erfolgreichen API-Antwort wird die Zusammenfassung auf der Ebene INFO und die vollständige Anfrage und Antwort auf der Ebene DEBUG protokolliert.

Bei einer Anfrage, die zu einem API-Fehler führt, wird die Zusammenfassungsnachricht auf der Ebene WARN und die vollständige Anfrage und Antwort auf der Ebene INFO protokolliert.

Teilweise fehlgeschlagene Vorgänge werden auf der Ebene DEBUG protokolliert.

Anfrage-ID

In den meisten Fällen enthalten die von der Clientbibliothek generierten Logs genügend Details, um Probleme zu beheben. Wenn Sie sich an den Support wenden, geben Sie entweder die Logs an (in denen vertrauliche Informationen standardmäßig entfernt werden) oder teilen Sie die Anfrage-ID mit, die als Teil des Antwortlogs protokolliert wird.

Wenn Sie die Anfrage-ID lieber selbst erfassen möchten, können Sie einen der folgenden Ansätze verwenden:

Extrahieren über normale API-Aufrufe

Sie können eine benutzerdefinierte CallSetting mit einem TrailingMetadataHandler verwenden, um Anfrage-IDs aus regulären unären Aufrufen zu erfassen.

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);

Extrahieren über Streaming-API-Aufrufe

Die Anfrage-ID wird als Teil des Antwortobjekts für Streaming-API-Aufrufe zurückgegeben. So können Sie beispielsweise die Anfrage-ID für einen SearchStream-Aufruf abrufen:

// 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,
    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);
        }
    }
);

Ausnahmen

Die Anfrage-ID wird als Teil der Ausnahme GoogleAdsException zurückgegeben, wenn ein API-Aufruf fehlschlägt.

try
{
  // Make an API call.
  ...
}
catch (GoogleAdsException e)
{
    string requestId = e.RequestId;
}

Erweiterte Protokollierung

Wenn das API-Log nicht genügend Details enthält, aktivieren Sie die Protokollierung auf einer niedrigeren Ebene auf gRPC-Ebene. Beachten Sie, dass die Ausgabe sehr umfangreich sein kann. Die gRPC-Logs werden in „stderr“ geschrieben. Sie können aber wie in diesem Beispiel gezeigt einen eigenen Logger anhängen. Unterstützte Umgebungsvariablen.

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

TraceListener-Konfiguration mit App.config (Legacy)

Wenn Ihre App für ein .NET Framework-Ziel erstellt wird, können Sie die Protokollierungskonfiguration aus der Datei App.config oder Web.config Ihrer App laden. Dies ist eine Legacy-Funktion von .NET, die für Apps, die für .NET Core-Ziele erstellt wurden, nicht unterstützt wird.

Wenn Sie diese Funktion verwenden möchten, müssen Sie die folgenden Änderungen an Ihrer Konfigurationsdatei vornehmen:

  1. Fügen Sie den folgenden Code-Snippet unter dem Abschnitt <configuration> ein.

    <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. Fügen Sie den folgenden Code-Snippet unter dem Abschnitt <configSections> ein.

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

    Ihre App.config sieht dann so aus:

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