로깅

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

마지막으로 trace를 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);
        }
    }
);

예외

요청 ID는 API 호출이 실패할 때마다 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 기능으로, .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>