Logging

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

TraceListener

Sie können das Logging in einem TraceListener aktivieren, indem Sie der Methode Main die folgende Zeile 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);

ILogger

Falls Sie bereits ein ILogger für Ihre Anwendungsprotokolle nutzen, können Sie mit dieser Lösung Google Ads API-Protokolle in die vorhandenen Protokolle einbinden.

Erstellen Sie zuerst eine LoggerFactory oder fügen Sie die Filter für Google Ads API-Logs hinzu, falls bereits vorhanden:

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 LoggerFactory, um Logger für Anfrage- und Antwortzusammenfassungen und Details zu erstellen:

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

Konfigurieren Sie abschließend die Clientbibliothek so, dass ihre Traces an Ihre ILogger-Instanzen weitergeleitet werden:

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

Mit dieser Lösung können Sie Anfrage- und Antwortprotokolle der Google Ads API in vorhandene Logging-Frameworks wie Log4Net, NLog und Serilog einbinden.

Logebenen

Die Bibliothek protokolliert verschiedene Ereignistypen auf verschiedenen Logebenen. Für eine erfolgreiche API-Antwort wird die Zusammenfassung unter INFO protokolliert. Die vollständigen Anfragen und Antworten werden unter DEBUG protokolliert.

Bei einer Anfrage, die zu einem API-Fehler führt, wird die zusammenfassende Meldung unter WARN protokolliert. Die vollständige Anfrage sowie die Antwort werden unter INFO protokolliert.

Teilfehler werden unter DEBUG protokolliert.

Antrags-ID

In den meisten Fällen enthalten die von der Clientbibliothek generierten Logs ausreichend Details zur Fehlerbehebung. Wenn Sie sich an das Supportforum bzw. die Aliasse wenden, können Sie entweder die Logs angeben, wodurch vertrauliche Informationen standardmäßig entfernt werden, oder einfach die Anfrage-ID teilen, 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:

Extraktion über normale API-Aufrufe

Sie können einen benutzerdefinierten 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);

Extraktion über Streaming API-Aufrufe

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

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

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

Erweitertes Logging

Wenn das API-Log nicht genügend Details enthält, aktivieren Sie das Logging auf unterer Ebene auf gRPC-Ebene. Beachten Sie, dass die Ausgabe sehr umfangreich sein kann. Die gRPC-Logs werden in stderr geschrieben, Sie können jedoch Ihren eigenen Logger anhängen, wie unten gezeigt. 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 Anwendung für ein .NET Framework-Ziel erstellt, können Sie die Logging-Konfiguration aus der Datei App.config oder Web.config Ihrer Anwendung laden. Dies ist eine Legacy-.NET-Funktion, die für Anwendungen, die für .NET Core-Ziele erstellt wurden, nicht unterstützt wird.

Um dieses Feature zu verwenden, müssen Sie die folgenden Änderungen an der Konfigurationsdatei vornehmen:

  1. Fügen Sie im Abschnitt <configuration> das folgende Snippet hinzu.

    <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 im Abschnitt <configSections> das folgende Snippet hinzu.

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

    Ihr App.config sieht dann so aus:

    <?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>