2012-03-15 6 views
6

मैं Azure से पिछले घंटे के लिए सभी का पता लगाने डेटा प्राप्त करने के लिए निम्न कोड का उपयोग करने के कोशिश कर रहा हूँ:, मैं खोजने रहा है कि कोई परिणाम नहीं पाए जाते हैंAzure: प्रोग्राम के रूप में पता लगाने के लिए डेटा WADLogsTable क्वेरी करने

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

हालांकि जब मुझे पता है कि आखिरी घंटे के लिए टेबल में डेटा है (मैं आउटपुट की तुलना सेरेब्रेटा के एज़ूर डायग्नोस्टिक्स मैनेजर से कर रहा हूं)।

मैं दो प्रश्न हैं:

  1. इस सही तरीके से WADLogsTable क्वेरी करने के लिए है? मैं परिणाम क्यों नहीं देख रहा हूं?
  2. जेनेरिक पैरामीटर के रूप में पास करने के लिए सही प्रकार क्या है? TableServiceEntity एक बेस क्लास है जो केवल तीन कॉलम परिभाषित करता है। मैं जानना चाहता हूं कि कोई ऐसा प्रकार है जो विशेष रूप से WADLogsTable इकाई का प्रतिनिधित्व करता है। क्या मैं सिर्फ गुणों के साथ कॉलम नामों के समान एक प्रकार बना सकता हूं?

उत्तर

11

बॉक्स प्रकार (कक्षा) में से कोई भी नहीं है जो WADLogs इकाई का प्रतिनिधित्व करेगा। बेस क्लास का उपयोग करके आप केवल पार्टियनकी, रोकी और टाइमस्टैम्प गुण प्राप्त करेंगे। आपको इसे स्वयं परिभाषित करना होगा। यहां एक नमूना मैं उपयोग करते हैं:

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

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

इसके अलावा, जब मैं WADLogs तालिका के साथ संघर्ष कर रहा था, मैं इसे इस कोड के साथ (पिछले 24 घंटों के लिए) परिणाम दिखा पाने में कामयाब रहे

मैंने नोट किया कि टिक की गणना से पहले विभाजन कुंजी में "0" उपसर्ग है।

+1

धन्यवाद एंटोन। आपके दूसरे स्निपेट में 'this' का प्रकार क्या है? – David

+0

यह ठीक है, मैंने काम किया है यह एक 'IQueryable ' है। – David

+2

धन्यवाद, मुझे यह काम मिल गया है। कारण यह पहले काम नहीं करता था क्योंकि, कुछ उत्तेजक कारणों से, आप 'टाइमस्टैम्प' कॉलम के खिलाफ क्वेरी नहीं कर सकते हैं। आपके लिए शीर्ष अंक, एंटोन। – David

-1

नवीनतम (2014) 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; डॉ आप टाइमस्टैम्प छानने के लिए उपयोग कर सकते हैं।

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

जुड़ा हुआ उदाहरण में इकाई का विस्तार करके, आप संदेश और दिनांक चर का पर्दाफाश कर सकते हैं:

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

    public string Message 
    { 
     get { return Properties["Message"].StringValue; } 
    } 
} 
संबंधित मुद्दे