Ghi nhật ký

Thư viện ứng dụng .NET sẽ ghi lại các yêu cầu, phản hồi và thông báo tóm tắt được gửi đến API Google Ads. Bạn có thể ghi nhật ký vào một thực thể TraceListener tuỳ chỉnh hoặc vào một thực thể ILogger tuỳ chỉnh.

TraceListener

Bạn có thể bật tính năng ghi nhật ký vào TraceListener bằng cách thêm dòng sau vào phương thức Main trước khi thực hiện bất kỳ lệnh gọi API nào.

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

Nếu bạn đã sử dụng ILogger cho nhật ký ứng dụng, thì giải pháp này cho phép bạn tích hợp nhật ký API Google Ads vào nhật ký hiện có.

Trước tiên, hãy tạo một LoggerFactory hoặc nếu bạn đã có, hãy thêm các bộ lọc cho nhật ký API Google Ads:

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);
});

Sau đó, hãy sử dụng LoggerFactory để tạo trình ghi nhật ký cho bản tóm tắt và thông tin chi tiết về yêu cầu và phản hồi:

ILogger summaryLogger = loggerFactory.CreateLogger(TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE);
ILogger detailLogger = loggerFactory.CreateLogger(TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE);

Cuối cùng, hãy định cấu hình thư viện ứng dụng để chuyển hướng dấu vết của thư viện đó đến các thực thể ILogger của bạn:

TraceUtilities.ConfigureSummaryLogger(summaryLogger);
TraceUtilities.ConfigureDetailLogger(detailLogger);

Giải pháp này cho phép bạn tích hợp nhật ký phản hồi và yêu cầu của API Google Ads vào các khung ghi nhật ký hiện có, chẳng hạn như Log4Net, NLog và Serilog.

Các cấp độ nhật ký

Thư viện này ghi lại nhiều loại sự kiện cho từng cấp độ nhật ký. Để phản hồi API thành công, bản tóm tắt sẽ được ghi tại INFO, còn yêu cầu và phản hồi đầy đủ sẽ được ghi tại DEBUG.

Đối với một yêu cầu dẫn đến lỗi API, thông báo tóm tắt sẽ được ghi vào WARN, còn yêu cầu và phản hồi đầy đủ sẽ được ghi vào INFO.

Lỗi một phần được ghi lại vào DEBUG.

Mã yêu cầu

Trong hầu hết các trường hợp, nhật ký do thư viện ứng dụng tạo sẽ cung cấp đủ thông tin chi tiết để khắc phục vấn đề. Khi liên hệ với diễn đàn/email đại diện hỗ trợ, bạn có thể cung cấp nhật ký (loại bỏ thông tin nhạy cảm theo mặc định) hoặc chỉ cần chia sẻ mã yêu cầu (được ghi trong nhật ký phản hồi).

Nếu muốn tự thu thập mã yêu cầu, bạn có thể sử dụng một trong các phương pháp sau:

Trích xuất thông qua các lệnh gọi API thông thường

Bạn có thể sử dụng CallSetting tuỳ chỉnh với TrailingMetadataHandler để thu thập mã yêu cầu của các lệnh gọi đơn giản thông thường.

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);

Trích xuất thông qua lệnh gọi API truyền trực tuyến

Mã yêu cầu được trả về như một phần của đối tượng phản hồi đối với các lệnh gọi API truyền trực tuyến. Ví dụ: bạn có thể lấy mã yêu cầu cho lệnh gọi SearchStream như sau:

// 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);
        }
    }
);

Ngoại lệ

Mã yêu cầu sẽ được trả về như một phần của ngoại lệ GoogleAdsException bất cứ khi nào một lệnh gọi API không thành công.

try
{
  // Make an API call.
  ...
}
catch (GoogleAdsException e)
{
    string requestId = e.RequestId;
}

Ghi nhật ký nâng cao

Nếu nhật ký API không cung cấp đủ thông tin chi tiết cho bạn, hãy bật thêm tính năng ghi nhật ký cấp thấp ở cấp gRPC. Hãy lưu ý rằng dữ liệu đầu ra có thể lớn. Nhật ký gRPC được ghi vào stderr, nhưng bạn có thể đính kèm trình ghi nhật ký của riêng mình như minh hoạ dưới đây. Các biến môi trường được hỗ trợ.

Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());

Cấu hình TraceListener bằng App.config (cũ)

Nếu ứng dụng của bạn được tạo cho một mục tiêu .NET Framework, bạn có thể tải cấu hình ghi nhật ký qua tệp App.config hoặc Web.config của ứng dụng. Đây là một chức năng .NET cũ không được hỗ trợ cho các ứng dụng được tạo cho các mục tiêu .NET Core.

Để sử dụng tính năng này, bạn cần thêm các thay đổi sau vào tệp cấu hình:

  1. Thêm đoạn mã sau trong phần <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. Thêm đoạn mã sau trong phần <configSections>.

    <section name="system.diagnostics" type="System.Diagnostics.SystemDiagnosticsSection"/>
    

    Khi đó, App.config của bạn sẽ có dạng như sau:

    <?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>