日志记录

.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过滤器,如果有,则添加 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 调用进行提取

您可以将自定义 CallSettingTrailingMetadataHandler 结合使用,以从常规一元调用中捕获请求 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.V16.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 调用失败时,请求 ID 将作为 GoogleAdsException 异常的一部分返回。

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.configWeb.config 文件加载日志记录配置。这是旧版 .NET 功能,针对 .NET Core 目标构建的应用不支持。

如需使用此功能,您需要将以下更改添加到配置文件中:

  1. <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>
    
  2. <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>