.NET 客户端库会记录向 Google Ads API 发出的请求、响应和摘要消息。日志可以写入自定义 TraceListener
或自定义 ILogger
实例。
TraceListener
您可以在进行任何 API 调用之前,在 Main
方法中添加以下代码行,以便将日志记录到 TraceListener
。
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
如果您已经在为应用日志使用 ILogger
,则可以通过此解决方案将 Google Ads API 日志集成到现有日志中。
首先,创建一个 LoggerFactory
;如果您已经有一个 LoggerFactory
,请为 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);
});
然后,使用 LoggerFactory
为请求和响应摘要和详细信息创建记录器:
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);
借助此解决方案,您可以将 Google Ads API 请求和响应日志集成到现有日志记录框架(例如 Log4Net、NLog 和 Serilog)。
日志级别
该库会将不同类型的事件记录到不同的日志级别。对于成功的 API 响应,系统会在 INFO
中记录摘要,并在 DEBUG
中记录完整的请求和响应。
对于导致 API 错误的请求,系统会在 WARN
中记录摘要消息,并在 INFO
中记录完整请求和响应。
部分失败会记录在 DEBUG
。
请求 ID
在大多数情况下,客户端库生成的日志会提供足够的详细信息来排查问题。与支持论坛/别名联系时,您可以提供日志(默认会隐去敏感信息),也可以仅分享请求 ID(会作为响应日志的一部分进行记录)。
如果您希望自行获取请求 ID,可以使用以下任一方法:
通过常规 API 调用进行提取
您可以将自定义 CallSetting
与 TrailingMetadataHandler
搭配使用,从常规单元调用中捕获请求 ID。
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);
通过流式 API 调用进行提取
请求 ID 会作为流式传输 API 调用的响应对象的一部分返回。例如,您可以按如下方式获取 SearchStream
调用的请求 ID:
// 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);
}
}
);
异常
每当 API 调用失败时,系统都会在 GoogleAdsException
异常中返回请求 ID。
try
{
// Make an API call.
...
}
catch (GoogleAdsException e)
{
string requestId = e.RequestId;
}
高级日志记录
如果 API 日志未提供足够的详细信息,请在 gRPC 级别启用更多低级日志记录。请注意,输出内容可能非常庞大。gRPC 日志会写入 stderr,但您可以附加自己的日志记录器,如下所示。支持的环境变量。
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());
使用 App.config 的 TraceListener 配置(旧版)
如果您的应用针对 .NET Framework 目标进行构建,您可以从应用的 App.config
或 Web.config
文件加载日志记录配置。这是旧版 .NET 功能,不适用于针对 .NET Core 目标平台构建的应用。
如需使用此功能,您需要在配置文件中添加以下更改:
在
<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>
在
<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>