La bibliothèque cliente .NET consigne les requêtes, les réponses et les messages récapitulatifs envoyés à l'API Google Ads. Les journaux peuvent être écrits dans un TraceListener
personnalisé ou dans une instance ILogger
personnalisée.
TraceListener
Vous pouvez activer la journalisation dans un TraceListener
en ajoutant la ligne suivante dans votre méthode Main
avant d'effectuer des appels d'API.
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
Si vous utilisez déjà un ILogger
pour les journaux de votre application, cette solution vous permet d'intégrer les journaux de l'API Google Ads dans vos journaux existants.
Commencez par créer un LoggerFactory
. Si vous en avez déjà un, ajoutez les filtres pour les journaux de l'API Google Ads:
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);
});
Utilisez ensuite LoggerFactory
pour créer des enregistreurs pour les résumés et les détails des requêtes et des réponses:
ILogger summaryLogger = loggerFactory.CreateLogger(TraceUtilities.SUMMARY_REQUEST_LOGS_SOURCE);
ILogger detailLogger = loggerFactory.CreateLogger(TraceUtilities.DETAILED_REQUEST_LOGS_SOURCE);
Enfin, configurez la bibliothèque cliente pour rediriger ses traces vers vos instances ILogger
:
TraceUtilities.ConfigureSummaryLogger(summaryLogger);
TraceUtilities.ConfigureDetailLogger(detailLogger);
Cette solution vous permet d'intégrer les journaux de requêtes et de réponses de l'API Google Ads dans des frameworks de journalisation existants, tels que Log4Net, NLog et Serilog.
Niveaux de journalisation
La bibliothèque consigne différents types d'événements à différents niveaux de journalisation. Pour une réponse API réussie, le résumé est consigné dans INFO
, et la requête complète et les réponses sont consignées dans DEBUG
.
Pour une requête qui génère une erreur d'API, le message récapitulatif est consigné dans WARN
, et la requête et la réponse complètes sont consignées dans INFO
.
Les échecs partiels sont consignés dans DEBUG
.
Identifiant de la demande
Dans la plupart des cas, les journaux générés par la bibliothèque cliente fournissent suffisamment de détails pour résoudre vos problèmes. Lorsque vous contactez le forum/les alias d'assistance, vous pouvez fournir les journaux (qui masquent les informations sensibles par défaut) ou simplement partager l'ID de requête (qui est consigné dans le journal des réponses).
Si vous préférez capturer vous-même l'ID de requête, vous pouvez utiliser l'une des approches suivantes:
Extraction via des appels d'API ordinaires
Vous pouvez utiliser un CallSetting
personnalisé avec un TrailingMetadataHandler
pour capturer les ID de requête à partir d'appels unaires réguliers.
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);
Extraction via des appels d'API en streaming
L'ID de requête est renvoyé dans l'objet de réponse pour les appels d'API de streaming. Par exemple, vous pouvez obtenir l'ID de requête d'un appel SearchStream
comme suit:
// 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);
}
}
);
Exceptions
L'ID de requête est renvoyé dans l'exception GoogleAdsException
chaque fois qu'un appel d'API échoue.
try
{
// Make an API call.
...
}
catch (GoogleAdsException e)
{
string requestId = e.RequestId;
}
Journalisation avancée
Si le journal de l'API ne vous fournit pas suffisamment de détails, activez une journalisation de bas niveau au niveau de gRPC. N'oubliez pas que la sortie peut être volumineuse. Les journaux gRPC sont écrits dans stderr, mais vous pouvez associer votre propre journalisateur, comme indiqué ci-dessous. Variables d'environnement compatibles
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "http");
GrpcEnvironment.SetLogger(new ConsoleLogger());
Configuration de TraceListener à l'aide d'App.config (ancien)
Si votre application est compilée pour une cible .NET Framework, vous pouvez charger la configuration de journalisation à partir du fichier App.config
ou Web.config
de votre application. Il s'agit d'une ancienne fonctionnalité .NET qui n'est pas compatible avec les applications compilées pour les cibles .NET Core.
Pour utiliser cette fonctionnalité, vous devez ajouter les modifications suivantes à votre fichier de configuration:
Ajoutez l'extrait suivant sous la section
<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>
Ajoutez l'extrait suivant sous la section
<configSections>
.<section name="system.diagnostics" type="System.Diagnostics.SystemDiagnosticsSection"/>
Votre
App.config
se présente alors comme suit:<?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>