Biblioteka klienta .NET rejestruje żądania, odpowiedzi i wiadomości podsumowujące wysyłane do interfejsu Google Ads API. Dzienniki mogą być zapisywane w niestandardowej instancji TraceListener
lub w niestandardowej instancji ILogger
.
TraceListener
Aby włączyć rejestrowanie w TraceListener
, dodaj ten wiersz w metodzie Main
przed wykonaniem wywołań interfejsu 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
Jeśli w przypadku logów aplikacji używasz już ILogger
, to rozwiązanie umożliwia zintegrowanie logów interfejsu Google Ads API z dotychczasowymi logami.
Najpierw utwórz LoggerFactory
lub, jeśli już go masz, dodaj filtry do logów interfejsu Google Ads API:
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);
});
Następnie użyj LoggerFactory
, aby utworzyć rejestratory podsumowań i szczegółów żądań i odpowiedzi:
ILogger summaryLogger = loggerFactory.CreateLogger(TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE);
ILogger detailLogger = loggerFactory.CreateLogger(TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE);
Na koniec skonfiguruj bibliotekę klienta, aby przekierowywała ślady do instancji ILogger
:
TraceUtilities.ConfigureSummaryLogger(summaryLogger);
TraceUtilities.ConfigureDetailLogger(detailLogger);
To rozwiązanie umożliwia integrację logów żądań i odpowiedzi interfejsu Google Ads API z istniejącymi platformami rejestrowania, takimi jak Log4Net, NLog i Serilog.
Poziomy rejestrowania
Biblioteka rejestruje różne typy zdarzeń na różnych poziomach dziennika. W przypadku prawidłowej odpowiedzi interfejsu API podsumowanie jest rejestrowane w INFO
, a pełne żądanie i odpowiedzi – w DEBUG
.
W przypadku żądania, które powoduje błąd interfejsu API, komunikat podsumowujący jest rejestrowany na poziomie WARN
, a pełne żądanie i odpowiedź są rejestrowane na poziomie INFO
.
Częściowe niepowodzenia są rejestrowane w DEBUG
.
Identyfikator żądania
W większości przypadków dzienniki generowane przez bibliotekę klienta zawierają wystarczającą ilość szczegółów, aby rozwiązać problemy. Gdy kontaktujesz się z forum pomocy lub aliasami, możesz podać dzienniki (które domyślnie usuwają informacje poufne) lub tylko udostępnić identyfikator żądania (który jest rejestrowany w ramach dziennika odpowiedzi).
Jeśli wolisz samodzielnie rejestrować identyfikator żądania, możesz skorzystać z jednego z tych sposobów:
Wyodrębnianie za pomocą zwykłych wywołań interfejsu API
Możesz użyć niestandardowego CallSetting
z TrailingMetadataHandler
, aby rejestrować identyfikatory żądań ze zwykłych wywołań jednoargumentowych.
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);
Wyodrębnianie za pomocą wywołań interfejsu API przesyłania strumieniowego
Identyfikator żądania jest zwracany w ramach obiektu odpowiedzi w przypadku wywołań interfejsu Streaming API. Możesz na przykład uzyskać identyfikator żądania wywołania SearchStream
w ten sposób:
// Get the GoogleAdsService.
GoogleAdsServiceClient googleAdsService = client.GetService(
Services.V20.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);
}
}
);
Wyjątki
Identyfikator żądania jest zwracany w ramach wyjątku GoogleAdsException
za każdym razem, gdy wywołanie interfejsu API się nie powiedzie.
try
{
// Make an API call.
...
}
catch (GoogleAdsException e)
{
string requestId = e.RequestId;
}
Zaawansowane logowanie
Jeśli dziennik interfejsu API nie zawiera wystarczających informacji, włącz rejestrowanie na niższym poziomie na poziomie gRPC. Pamiętaj, że dane wyjściowe mogą być obszerne. Dzienniki gRPC są zapisywane w stderr, ale możesz dołączyć własny rejestrator, jak pokazano poniżej. Obsługiwane zmienne środowiskowe
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());
Konfiguracja TraceListener za pomocą pliku App.config (starsza wersja)
Jeśli aplikacja jest tworzona na platformę .NET Framework, możesz wczytać konfigurację rejestrowania z pliku App.config
lub Web.config
aplikacji. Jest to starsza funkcja .NET, która nie jest obsługiwana w przypadku aplikacji utworzonych na potrzeby platformy .NET Core.
Aby korzystać z tej funkcji, musisz wprowadzić w pliku konfiguracji te zmiany:
Dodaj ten fragment kodu w sekcji
<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>
Dodaj ten fragment kodu w sekcji
<configSections>
.<section name="system.diagnostics" type="System.Diagnostics.SystemDiagnosticsSection"/>
App.config
wygląda wtedy tak:<?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>