로깅

.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 호출을 통한 추출

TrailingMetadataHandler와 함께 커스텀 CallSetting를 사용하여 일반 단항 호출에서 요청 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.V20.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.config 또는 Web.config 파일에서 로깅 구성을 로드할 수 있습니다. 이는 .NET Core 타겟용으로 빌드된 앱에서 지원되지 않는 기존 .NET 기능입니다.

이 기능을 사용하려면 구성 파일에 다음 변경사항을 추가해야 합니다.

  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>