Logging

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

TraceListener

Sie können die Protokollierung in einer TraceListener aktivieren, indem Sie die folgende Zeile in Ihre Main-Methode einfü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

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

Erstellen Sie zuerst eine LoggerFactory. Wenn Sie bereits eine haben, fügen Sie die Filter für Google Ads API-Protokolle 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);
});

Erstellen Sie dann mit LoggerFactory Logging-Objekte für Zusammenfassungen und Details zu Anfragen und Antworten:

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 Google Ads API-Anfrage- und Antwortprotokolle in vorhandene Logging-Frameworks wie Log4Net, NLog und Serilog einbinden.

Protokollebenen

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

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

Teilweise fehlgeschlagene Vorgänge werden unter DEBUG protokolliert.

Antrags‑ID

In den meisten Fällen enthalten die von der Clientbibliothek generierten Protokolle ausreichende Details, um die Probleme zu beheben. Wenn Sie sich an das Supportforum oder an Aliasse wenden, können Sie entweder die Protokolle zur Verfügung stellen (in denen sensible Informationen standardmäßig entfernt werden) oder nur die Anfrage-ID teilen (die als Teil des Antwortlogs protokolliert wird).

Wenn Sie die Anfrage-ID lieber selbst erfassen möchten, haben Sie folgende Möglichkeiten:

Extraktion über normale API-Aufrufe

Du kannst eine benutzerdefinierte CallSetting mit einer TrailingMetadataHandler verwenden, um Anfrage-IDs aus regulären unary-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 kannst du beispielsweise die Anfrage-ID für einen SearchStream-Aufruf abrufen:

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

Ausnahmen

Die Anfrage-ID wird als Teil der GoogleAdsException-Ausnahme 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 detaillierteres Logging auf gRPC-Ebene. Beachten Sie, dass die Ausgabe sehr umfangreich sein kann. Die gRPC-Logs werden in stderr geschrieben. Sie können jedoch wie unten gezeigt einen eigenen Protokoller anhängen. Unterstützte Umgebungsvariablen

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

TraceListener-Konfiguration mit App.config (alt)

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 alte .NET-Funktion, 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 Ihrer Konfigurationsdatei die folgenden Änderungen hinzufügen:

  1. Fügen Sie das folgende Snippet unter dem Abschnitt <configuration> 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 das folgende Snippet unter dem Abschnitt <configSections> hinzu.

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

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