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