.NET istemci kitaplığı, Google Ads API'ye gönderilen istekleri, yanıtları ve özet mesajları günlüğe kaydeder. Günlükler özel bir TraceListener veya özel bir ILogger örneğine yazılabilir.
TraceListener
Herhangi bir API çağrısı yapmadan önce Main yönteminize aşağıdaki satırları ekleyerek TraceListener için günlük kaydını etkinleştirebilirsiniz:
using Google.Ads.GoogleAds.Util;
// Detailed logs.
TraceUtilities.Configure(
TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE,
"logs/details.log",
System.Diagnostics.SourceLevels.All);
// Summary logs.
TraceUtilities.Configure(
TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE,
"logs/summary.log",
System.Diagnostics.SourceLevels.All);
ILogger
Uygulama günlükleriniz için zaten bir ILogger kullanıyorsanız bu çözüm, Google Ads API günlüklerini mevcut günlük kaydı altyapınıza entegre etmenize olanak tanır.
Öncelikle bir LoggerFactory oluşturun veya zaten bir havuzunuz varsa Google Ads API günlükleri için filtreleri ekleyin:
var loggerFactory = LoggerFactory.Create(builder =>
{
// Log to stdout.
builder.AddConsole();
builder.AddFilter(
TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE, LogLevel.Trace);
builder.AddFilter(
TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE, LogLevel.Trace);
});
Ardından, istek ve yanıt özetleri ile ayrıntıları için günlükçüler oluşturmak üzere LoggerFactory simgesini kullanın:
ILogger summaryLogger = loggerFactory.CreateLogger(
TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE);
ILogger detailLogger = loggerFactory.CreateLogger(
TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE);
Son olarak, izlerini ILogger örneklerinize yönlendirmek için istemci kitaplığını yapılandırın:
TraceUtilities.ConfigureSummaryLogger(summaryLogger);
TraceUtilities.ConfigureDetailLogger(detailLogger);
Bu çözüm, Google Ads API istek ve yanıt günlüklerini mevcut günlük çerçevelerine (ör. Log4Net, NLog ve Serilog) entegre etmenize olanak tanır.
Günlük kaydı düzeyleri
Kitaplık, farklı günlük düzeylerinde farklı türlerde etkinlikler günlüğe kaydeder:
- Başarılı API yanıtı: Özet
INFOkonumunda, tam istek ve yanıt iseDEBUGkonumunda günlüğe kaydedilir. - API hata yanıtı: Özet mesaj
WARNkonumuna kaydedilir; tam istek ve yanıtINFOkonumuna kaydedilir. - Kısmi hatalar:
DEBUGadresinde günlüğe kaydedilir.
Talep numarası
Çoğu durumda, istemci kitaplığı tarafından oluşturulan günlükler sorunlarınızı gidermek için yeterli ayrıntıyı sağlar. Destek ekibiyle iletişime geçtiğinizde günlükleri (hassas kimlik doğrulama alanları varsayılan olarak çıkartılır) sağlayın veya yanıt günlüğünün bir parçası olarak günlüğe kaydedilen istek kimliğini paylaşın.
İstek kimliğini programatik olarak yakalamayı tercih ediyorsanız aşağıdaki yaklaşımlardan birini kullanın.
Sıradan tekli API çağrılarından ayıklama
Normal tekli çağrılardan istek kimliklerini yakalamak için TrailingMetadataHandler ile özel bir CallSettings kullanabilirsiniz:
CallSettings callSettings = CallSettings.FromTrailingMetadataHandler(
metadata =>
{
// Extract and log the request ID from the trailing metadata.
string requestId = metadata.Get("request-id")?.Value;
Console.WriteLine($"Request ID: {requestId}");
});
// Add the campaigns.
MutateCampaignsResponse retVal = campaignService.MutateCampaigns(
customerId.ToString(), operations.ToArray(), callSettings);
Akış API çağrılarından ayıklama
İstek kimliği, akış API'si çağrıları için yanıt nesnesinin bir parçası olarak döndürülür. Örneğin, bir SearchStream çağrısının istek kimliğini aşağıdaki gibi alabilirsiniz:
// Get the GoogleAdsService.
GoogleAdsServiceClient googleAdsService = client.GetService(
Services.V26.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,
(SearchGoogleAdsStreamResponse resp) =>
{
// Extract the request ID from the response.
string requestId = resp.RequestId;
Console.WriteLine($"Request ID: {requestId}");
foreach (GoogleAdsRow googleAdsRow in resp.Results)
{
Console.WriteLine(
"Campaign with ID {0} and name '{1}' was found.",
googleAdsRow.Campaign.Id,
googleAdsRow.Campaign.Name);
}
}
);
İstisnalar
İstek kimliği, bir API çağrısı her başarısız olduğunda GoogleAdsException istisnası kapsamında döndürülür:
try
{
// Make an API call.
}
catch (GoogleAdsException e)
{
string requestId = e.RequestId;
Console.WriteLine($"Failed Request ID: {requestId}");
}
Gelişmiş günlük kaydını yapılandırma
API günlüğü yeterli ayrıntı vermiyorsa gRPC aktarım düzeyinde daha düşük düzeyde günlük kaydını etkinleştirin. Çıktının hacimli olabileceğini unutmayın.
Varsayılan Grpc.Net.Client aktarımını kullanırken Grpc kategorisi için bir filtre ekleyerek (ör. builder.AddFilter("Grpc", LogLevel.Debug)) .NET'in ILogger sağlayıcısı aracılığıyla aktarım düzeyindeki günlükleri yapılandırın.
Eski Grpc.Core aktarımını (UseGrpcCore = true) kullanıyorsanız gRPC günlükleri varsayılan olarak stderr konumuna yazılır. Alternatif olarak, aşağıdaki örnekte gösterildiği gibi kendi günlükçünüzü de ekleyebilirsiniz. Daha fazla bilgi için desteklenen gRPC ortam değişkenleri başlıklı makaleyi inceleyin.
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());
App.config (eski) kullanarak TraceListener yapılandırması
Uygulamanız bir .NET Framework hedefi için derleniyorsa günlük kaydı yapılandırmasını uygulamanızın App.config veya Web.config dosyasından yükleyebilirsiniz. Bu, modern .NET hedefleri için oluşturulan uygulamalarda desteklenmeyen eski bir .NET işlevidir.
Bu özelliği kullanmak için yapılandırma dosyanızda aşağıdaki değişiklikleri yapın:
<configuration>bölümünün altına aşağıdaki snippet'i ekleyin:<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 a 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 a 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 Google Ads .NET libraries. The default level is set to Warning. To disable all messages, set this value to Off. --> <add name="GoogleAds.DeprecationMessages" value="Warning" /> <!-- Use this trace switch to control the detailed request logs written by Google 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 Google 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><configSections>bölümünün altına aşağıdaki snippet'i ekleyin:<section name="system.diagnostics" type="System.Diagnostics.SystemDiagnosticsSection" />App.configşu şekilde görünür:<?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>