2012-03-15 4 views
6

Sto cercando di utilizzare il seguente codice per ottenere tutti i dati di traccia per l'ultima ora da Azure:Azure: programmazione interrogazione WADLogsTable per i dati di traccia

   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(); 

Tuttavia, ho constatato che Nessun risultato quando so che ci sono dati nella tabella per l'ultima ora (sto confrontando l'output con Azure Diagnostics Manager di Cerebrata).

Ho due domande:

  1. E 'questo il modo giusto per interrogare WADLogsTable? Perché non vedo alcun risultato ?
  2. Qual è il tipo corretto da passare come parametro generico ? TableServiceEntity è una classe base che definisce solo tre colonne. Mi piacerebbe sapere se c'è un tipo che rappresenta un'entità WADLogsTable . Creo solo un tipo con le proprietà uguali ai nomi delle colonne?

risposta

11

Non esiste un tipo di casella (classe) che rappresenta l'entità WADLogs. Usando la classe base otterrai solo le proprietà PartionKey, RowKey e Timestamp. Devi definirlo da solo. Ecco un esempio che io uso:

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))); 
      } 
     } 
    } 

Inoltre, quando ero alle prese con la tabella WADLogs, sono riuscito ad ottenere è che mostra i risultati (per le ultime 24 ore) con questo codice:

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); 

Ho notato che c'è un prefisso "0" nella chiave di partizione prima del conteggio delle zecche.

+1

Grazie Anton. Qual è il tipo di "questo" nel tuo secondo frammento? – David

+0

Va bene, ho capito che è un 'IQueryable '. – David

+2

Grazie, ho funzionato ora. Il motivo per cui non funzionava prima era perché, per qualche ragione straziante, non si può eseguire una query sulla colonna 'Timestamp'. Il massimo dei voti, Anton. – David

-1

Per gli utenti della più recente (2014) client Azure:

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

tl; dr si possibile utilizzare Timestamp per il filtraggio.

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

Estendendo l'entità nell'esempio collegato, è possibile esporre le variabili dei messaggi e la data:

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

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