Günlük kaydını yapılandırın

.NET istemci kitaplığı, Google Ads API'ye yapılan istekleri, yanıtları ve özet mesajlarını günlüğe kaydeder. Günlükler özel bir TraceListener veya özel bir ILogger örneğine yazılabilir.

TraceListener

API çağrısı yapmadan önce TraceListener yönteminizde aşağıdaki satırları ekleyerek Main dosyasına kaydetmeyi 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 tane varsa Google Ads API günlükleri için filtreler 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, istemci kitaplığını izlemelerini ILogger örneklerinize yönlendirecek şekilde 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 INFO konumunda, tam istek ve yanıt ise DEBUG konumunda günlüğe kaydedilir.
  • API hata yanıtı: Özet mesaj WARN konumuna kaydedilir. Tam istek ve yanıt INFO konumuna kaydedilir.
  • Kısmi hatalar: DEBUG adresinde 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 ekibine ulaştığınızda günlükleri (varsayılan olarak hassas kimlik doğrulama alanlarını gizler) sağlayın veya yanıt günlüğünün bir parçası olarak kaydedilen istek kimliğini paylaşın.

İstek kimliğini programatik olarak yakalamayı tercih ederseniz aşağıdaki yaklaşımlardan birini kullanın.

Normal tekli API çağrılarından ayıklama

Normal tekli çağrılardan istek kimliklerini almak 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'si ç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, SearchStream araması için istek kimliğini aşağıdaki gibi alabilirsiniz:

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

İ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 kullanılarak TraceListener yapılandırması (eski)

Uygulamanız .NET Framework hedefi için oluşturuluyorsa 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ıza aşağıdaki değişiklikleri ekleyin:

  1. <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>
    
  2. <configSections> bölümünün altına aşağıdaki snippet'i ekleyin:

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

    App.config cihazınız aşağıdaki gibi 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>