7 votes

Azure : interrogation programmée de WADLogsTable pour les données de traçage

J'essaie d'utiliser le code suivant pour obtenir toutes les données de traçage de la dernière heure depuis Azure :

                StorageCredentialsAccountAndKey storageCredentialsAccountAndKey = new StorageCredentialsAccountAndKey(accountName, key);
                CloudStorageAccount csa = new CloudStorageAccount(storageCredentialsAccountAndKey, true);
                TableServiceContext tableServiceContext = new TableServiceContext(csa.TableEndpoint.ToString(), csa.Credentials);
                var results = tableServiceContext.CreateQuery<TableServiceEntity>("WADLogsTable").Where(
                    x => x.Timestamp > DateTime.UtcNow.AddHours(-1)).ToList();

Cependant, je constate qu'aucun résultat n'est trouvé lorsque je sais qu'il y a des données dans le tableau pour la dernière heure (je compare la sortie au gestionnaire de diagnostics Azure de Cerebrata).

J'ai deux questions :

  1. Est-ce la bonne façon d'interroger WADLogsTable ? Pourquoi ne vois-je pas de résultats ?
  2. Quel est le type correct à passer comme générique ? générique ? TableServiceEntity est une classe de base qui définit uniquement trois colonnes. J'aimerais savoir s'il existe un type qui représente une entité entité WADLogsTable spécifiquement. Dois-je simplement créer un type avec les mêmes propriétés que les noms des colonnes ?

12voto

astaykov Points 16668

Il n'existe pas de type (classe) prêt à l'emploi qui représenterait l'entité WADLogs. En utilisant la classe de base, vous n'obtiendrez que les propriétés PartionKey, RowKey et Timestamp. Vous devez les définir vous-même. Voici un exemple que j'utilise :

public class WadLogEntity
       : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
    {
        public WadLogEntity()
        {
            PartitionKey = "a";
            RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
        }

        public string Role { get; set; }
        public string RoleInstance { get; set; }
        public int Level { get; set; }
        public string Message { get; set; }
        public int Pid { get; set; }
        public int Tid { get; set; }
        public int EventId { get; set; }
        public DateTime EventDateTime
        {
            get
            {
                return new DateTime(long.Parse(this.PartitionKey.Substring(1)));
            }
        }
    }

Par ailleurs, lorsque je me débattais avec le tableau WADLogs, j'ai réussi à lui faire afficher les résultats (pour les dernières 24 heures) avec ce code :

  var dtThen = DateTime.UtcNow.AddHours(-24);
                var dtNow = DateTime.UtcNow;

                var logs = this._wadLogs.WadLogs.Where(
                    wl => 
                        wl.Level == 2 
                        && String.Compare(wl.PartitionKey,"0" + dtThen.Ticks.ToString()) >=0
                        && String.Compare(wl.PartitionKey, "0" + dtNow.Ticks.ToString()) < 0
                    ).Take(200);

J'ai noté qu'il y a un préfixe "0" dans la clé de partition avant le compte des ticks.

-1voto

Dunc Points 4360

Pour les utilisateurs du dernier client Azure Storage (2014) :

http://blogs.msdn.com/b/tilovell/archive/2014/02/11/how-to-view-azure-diagnostics-traces-from-wadlogstable-in-your-local-console-app.aspx

en résumé vous peut utiliser Timestamp pour le filtrage.

...
var query = table.CreateQuery<GenericTableEntity>()
    .Where(e => e.Timestamp > DateTime.UtcNow.AddMinutes(-120));

En étendant l'entité dans l'exemple lié, vous pouvez exposer les variables Message et Date :

public class LogEntity : GenericTableEntity 
{
    // Since Timestamp is a DateTimeOffset
    public DateTime LogDate
    {
        get { return Timestamp.UtcDateTime; }
    }

    public string Message
    {
        get { return Properties["Message"].StringValue; }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X