로깅

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

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.V17.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 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>