.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.V19.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 기능입니다.
이 기능을 사용하려면 구성 파일에 다음과 같은 변경사항을 추가해야 합니다.
<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>
<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>