El réponse que j'ai acceptée m'a énormément aidé à interroger directement la table via Visual Studio. Cependant, j'ai fini par avoir besoin d'une solution plus robuste. J'ai utilisé les conseils que j'ai obtenus ici pour développer quelques classes en C# qui me permettent d'utiliser LINQ pour interroger les tables. Au cas où cela serait utile à d'autres personnes consultant cette question, voici en gros comment j'interroge maintenant mes journaux Azure.
Créez une classe qui hérite de Microsoft.WindowsAzure.StorageClient.TableServiceEntity
pour représenter toutes les données de la table "WADLogsTable" :
public class AzureDiagnosticEntry : TableServiceEntity
{
public long EventTickCount { get; set; }
public string DeploymentId { get; set; }
public string Role { get; set; }
public string RoleInstance { get; set; }
public int EventId { get; set; }
public int Level { get; set; }
public int Pid { get; set; }
public int Tid { get; set; }
public string Message { get; set; }
public DateTime EventDateTime
{
get
{
return new DateTime(EventTickCount, DateTimeKind.Utc);
}
}
}
Créez une classe qui hérite de Microsoft.WindowsAzure.StorageClient.TableServiceContext
et fait référence à la classe d'objets de données nouvellement définie :
public class AzureDiagnosticContext : TableServiceContext
{
public AzureDiagnosticContext(string baseAddress, StorageCredentials credentials)
: base(baseAddress, credentials)
{
this.ResolveType = s => typeof(AzureDiagnosticEntry);
}
public AzureDiagnosticContext(CloudStorageAccount storage)
: this(storage.TableEndpoint.ToString(), storage.Credentials) { }
// Helper method to get an IQueryable. Hard code "WADLogsTable" for this class
public IQueryable<AzureDiagnosticEntry> Logs
{
get
{
return CreateQuery<AzureDiagnosticEntry>("WADLogsTable");
}
}
}
J'ai une méthode d'aide qui crée un CloudStorageAccount
à partir des paramètres de configuration :
public CloudStorageAccount GetStorageAccount()
{
CloudStorageAccount.SetConfigurationSettingPublisher(
(name, setter) => setter(RoleEnvironment.GetConfigurationSettingValue(name)));
string configKey = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";
return CloudStorageAccount.FromConfigurationSetting(configKey);
}
Je crée un AzureDiagnosticContext
de la CloudStorageAccount
et l'utiliser pour interroger mes journaux :
public IEnumerable<AzureDiagnosticEntry> GetAzureLog(DateTime start, DateTime end)
{
CloudStorageAccount storage = GetStorageAccount();
AzureDiagnosticContext context = new AzureDiagnosticContext(storage);
string startTicks = "0" + start.Ticks;
string endTicks = "0" + end.Ticks;
IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
e => e.PartitionKey.CompareTo(startTicks) > 0 &&
e.PartitionKey.CompareTo(endTicks) < 0);
CloudTableQuery<AzureDiagnosticEntry> tableQuery = query.AsTableServiceQuery();
IEnumerable<AzureDiagnosticEntry> results = tableQuery.Execute();
return results;
}
Cette méthode tire profit de l'astuce de performance dans La réponse de Gaurav pour filtrer sur PartitionKey
plutôt que Timestamp
.
Si vous vouliez filtrer les résultats en fonction d'autres critères que la date, vous pourriez filtrer les données retournées par l'option IEnumerable
. Mais, vous obtiendrez probablement de meilleures performances en filtrant le fichier IQueryable
. Vous pourriez ajouter un paramètre de filtrage à votre méthode et l'appeler au sein de la méthode IQueryable.Where()
. Eg,
public IEnumerable<AzureDiagnosticEntry> GetAzureLog(
DateTime start, DateTime end, Func<AzureDiagnosticEntry, bool> filter)
{
...
IQueryable<AzureDiagnosticEntry> query = context.Logs.Where(
e => e.PartitionKey.CompareTo(startTicks) > 0 &&
e.PartitionKey.CompareTo(endTicks) < 0 &&
filter(e));
...
}
Au final, j'ai encore plus abstrait la plupart de ces classes en classes de base afin de réutiliser la fonctionnalité pour interroger d'autres tables, comme celle qui stocke le journal des événements de Windows.