2012-03-15 21 views
6

Estoy intentando utilizar el código siguiente para obtener todos los datos de seguimiento durante la última hora de Azure:Azure: consultar programación WADLogsTable de datos de seguimiento

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

Sin embargo, estoy encontrando que no se encuentran resultados cuando sé que hay datos en la tabla durante la última hora (estoy comparando la salida con el Administrador de diagnóstico de Azure de Cerebrata).

Tengo dos preguntas:

  1. ¿Es este el camino correcto para consultar WADLogsTable? ¿Por qué no veo ningún resultado ?
  2. ¿Cuál es el tipo correcto para pasar como el parámetro genérico ? TableServiceEntity es una clase base que solo define tres columnas. Me gustaría saber si hay un tipo que represente específicamente una entidad WADLogsTable . ¿Acabo de crear un tipo con las propiedades igual que los nombres de las columnas?

Respuesta

11

No hay un tipo de caja (clase) que represente la entidad WADLogs. Con la clase base, solo obtendrá las propiedades PartionKey, RowKey y Timestamp. Tienes que definirlo por ti mismo. Aquí una muestra que utilizo:

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

Además, cuando he tenido problemas con la tabla WADLogs, me las arreglé para conseguir que muestra los resultados (de las últimas 24 horas) con este código:

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

Noté que hay un prefijo "0" en la clave de partición antes de que las marcas cuenten.

+1

Gracias Anton. ¿Cuál es el tipo de 'this' en tu segundo fragmento? – David

+0

Está bien, he resuelto que es un 'IQueryable '. – David

+2

Gracias, tengo esto funcionando ahora. La razón por la que no funcionó antes fue porque, por alguna razón insoportable, no puede consultar contra la columna 'Timestamp'. Las mejores marcas para ti, Anton. – David

-1

Para los usuarios del cliente Azure Storage última (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

tl; dr que puede utilizar marca de hora para el filtrado.

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

Al extender la entidad en el ejemplo enlazado, puede exponer las variables de mensaje y fecha:

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

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