کتابخانه کلاینت .NET درخواستها، پاسخها و پیامهای خلاصه ارسال شده به API گوگل ادز را ثبت میکند. این گزارشها را میتوان در یک TraceListener سفارشی یا در یک نمونه ILogger سفارشی نوشت.
TraceListener
شما میتوانید با اضافه کردن خطوط زیر در متد Main خود قبل از هرگونه فراخوانی API، ثبت وقایع در TraceListener را فعال کنید:
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 برای گزارشهای برنامه خود استفاده میکنید، این راهکار به شما امکان میدهد گزارشهای API تبلیغات گوگل را در زیرساخت گزارشگیری موجود خود ادغام کنید.
ابتدا، یک LoggerFactory ایجاد کنید، یا اگر از قبل یکی دارید، فیلترهای مربوط به گزارشهای API گوگل ادز را اضافه کنید:
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);
});
سپس، از LoggerFactory برای ایجاد loggerهایی برای خلاصهها و جزئیات درخواستها و پاسخها استفاده کنید:
ILogger summaryLogger = loggerFactory.CreateLogger(
TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE);
ILogger detailLogger = loggerFactory.CreateLogger(
TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE);
در نهایت، کتابخانه کلاینت را طوری پیکربندی کنید که ردپاهای خود را به نمونههای ILogger شما هدایت کند:
TraceUtilities.ConfigureSummaryLogger(summaryLogger);
TraceUtilities.ConfigureDetailLogger(detailLogger);
این راهکار به شما امکان میدهد گزارشهای درخواست و پاسخ API گوگل ادز را در چارچوبهای گزارشگیری موجود، مانند Log4Net، NLog و Serilog، ادغام کنید.
سطوح لاگ
این کتابخانه انواع مختلفی از رویدادها را در سطوح مختلف ثبت وقایع ثبت میکند:
- پاسخ موفقیتآمیز API : خلاصه در
INFOثبت میشود؛ درخواست و پاسخ کامل درDEBUGثبت میشوند. - پاسخ خطای API : پیام خلاصه در
WARNثبت میشود؛ درخواست و پاسخ کامل درINFOثبت میشوند. - خرابیهای جزئی : در
DEBUGثبت شدهاند.
درخواست شناسه
در بیشتر موارد، لاگهای ایجاد شده توسط کتابخانه کلاینت، جزئیات کافی برای عیبیابی مشکلات شما را ارائه میدهند. هنگام تماس با پشتیبانی ، یا لاگها را ارائه دهید (که به طور پیشفرض فیلدهای احراز هویت حساس را حذف میکنند) یا شناسه درخواست را که به عنوان بخشی از لاگ پاسخ ثبت میشود، به اشتراک بگذارید.
اگر ترجیح میدهید شناسه درخواست را به صورت برنامهنویسیشده دریافت کنید، از یکی از رویکردهای زیر استفاده کنید.
استخراج از فراخوانیهای API معمولی unary
میتوانید از یک CallSettings سفارشی به همراه TrailingMetadataHandler برای دریافت شناسههای درخواست از فراخوانیهای unary معمولی استفاده کنید:
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);
استخراج از فراخوانیهای API استریمینگ
شناسه درخواست به عنوان بخشی از شیء پاسخ برای فراخوانیهای API استریمینگ بازگردانده میشود. برای مثال، میتوانید شناسه درخواست را برای فراخوانی SearchStream به صورت زیر دریافت کنید:
// Get the GoogleAdsService.
GoogleAdsServiceClient googleAdsService = client.GetService(
Services.V25.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);
}
}
);
استثنائات
شناسه درخواست به عنوان بخشی از استثنای GoogleAdsException هر زمان که فراخوانی API با شکست مواجه شود، بازگردانده میشود:
try
{
// Make an API call.
}
catch (GoogleAdsException e)
{
string requestId = e.RequestId;
Console.WriteLine($"Failed Request ID: {requestId}");
}
پیکربندی گزارشگیری پیشرفته
اگر گزارش API جزئیات کافی به شما نمیدهد، گزارشگیری سطح پایینتر را در سطح انتقال gRPC فعال کنید. به خاطر داشته باشید که خروجی میتواند حجیم باشد.
هنگام استفاده از انتقال پیشفرض Grpc.Net.Client ، گزارشهای سطح انتقال را از طریق ارائهدهنده ILogger در .NET با اضافه کردن یک فیلتر برای دسته Grpc پیکربندی کنید (برای مثال، builder.AddFilter("Grpc", LogLevel.Debug) ).
اگر از انتقال قدیمی Grpc.Core استفاده میکنید ( UseGrpcCore = true )، گزارشهای gRPC به طور پیشفرض در stderr نوشته میشوند، یا میتوانید گزارشگیرنده خودتان را همانطور که در مثال زیر نشان داده شده است، پیوست کنید. برای جزئیات بیشتر، به متغیرهای محیطی پشتیبانی شده gRPC مراجعه کنید.
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());
پیکربندی TraceListener با استفاده از App.config (نسخه قدیمی)
اگر برنامه شما برای یک هدف .NET Framework ساخته شده است، میتوانید پیکربندی ثبت وقایع را از فایل App.config یا Web.config برنامه خود بارگذاری کنید. این یک قابلیت قدیمی .NET است که برای برنامههای ساخته شده برای اهداف .NET مدرن پشتیبانی نمیشود.
برای استفاده از این ویژگی، تغییرات زیر را به فایل پیکربندی خود اضافه کنید:
قطعه کد زیر را در بخش
<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 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>اضافه کنید:<section name="system.diagnostics" type="System.Diagnostics.SystemDiagnosticsSection" />سپس
App.configشما به این شکل خواهد بود:<?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>